webForumDet fria alternativet

Spara alla ändringar som Wikipedia - Hur funkar diff?

Webbutveckling

3 svar · 636 visningar · startad av erciz

Medlem sedan maj 20011 826 inlägg
Frågan#1

Om jag vill spara alla ändringar i en artikel, så som det är på en wiki. Hur lagrar jag då ändringarna för att spara utrymme?

Jag antar att det är någon form av diff, men vet inte hur det fungerar. Sparar man någon form av meta-data till ändringen i databasen? Hur strukturerar man upp det på ett bra sätt?

Medlem sedan juni 20014 421 inlägg
#2

Det finns ett par olika sätt, just wikipedia har valt en lösning som är snabb, men kräver att man lagrar mycket data (en liten parentes i den här frågan är ju att ett av wikipedias största problem i dagsläget är datamängden); de sparar hela artikeln med all data, varje gång.

Versionshanteringssystemet cvs kör på att bara ha delta store (dvs, bara lagra diffen från den tidigare ändringen); detta kräver avsevärt mindre data då man endast lagrar lagrar den initiella artikeln och sedan diffar. Tredje editeringen innebär alltså 1. initiell artikel -> diff -> diff på artikeln och föregående diff. Detta pågår i all oändlighet och man kan se det som en patch-kö där vissa diffar ska appliceras i en viss ordning för att få ett visst resultat. Denna metod är väldigt lagringseffektiv men kräver mycket mer beräkningskraft för att hämta ut ett visst resultat, det är även lättare att datan skulle gå sönder om t.ex ett steg i denna patch-kö skulle vara trasigt.

Ett tredje alternativ är att göra som versionshanteringssystemet mercurial (även kallat hg) gör, där det görs beräkningar på om denna delta plus tidigare deltas kräver större plats än alla deltas tillsammans från den senast gjorda ändringen. Tar tidigare deltas större plats sparas inte en diff utan filen i sin helhet och man börjar beräkna deltas från senaste sparningen och frammåt. Detta tar inte asevärt större plats än att bara spara deltas, det är heller inte avsevärt långsammare än att spara allting igen och utföra diffar på det. Den övre beskrvningen är en grav förenkling av mercurials algoritm, men i stort sett är det så den fungerar.

Använder du den tredje kan det vara en poäng att lagra lite mer metadata, typ storlek på alla diffar från den senaste fulla sparningen. Du behöver i alla fallen utom det första även lagra vilken som är föregångaren till redigeringen.

Medlem sedan feb. 20034 441 inlägg
#3

Jag har byggt ett översättningssystem som används på jobbet och där tillämpar vi versionhantering.

Det fungerar som wikipedia, att hela texten sparas. Varje natt kl. 02.00 körs ett script som arkiverar alla texter (från den näst senaste och hela vägen tillbaka till den första) för att spara lite utrymme.

Datan arkiveras i en annan databas men går fortfarande att nå då man är inne på en text. Så fort minsta lilla ändring gjorts sparas alltid en ny version.

Fungerar kanonbra, nu är det för internt bruk och det är kanske ~10 personer som arbetar i det dagligen.

Så vilken lösning du ska använda beror nog lite på vad du ska göra.

Medlem sedan maj 20011 826 inlägg
#4

colione skrev:

Det finns ett par olika sätt, just wikipedia har valt en lösning som är snabb, men kräver att man lagrar mycket data (en liten parentes i den här frågan är ju att ett av wikipedias största problem i dagsläget är datamängden); de sparar hela artikeln med all data, varje gång.

Va!? :o Är det sant? Det måste ju bli helt galet mycket data om de sparar hela artikeln för varje ändring som sker. Hm.

Ja, en delta-variant hade ju varit önskvärd, men det verkar inte vara helt trivialt att implementera en sån. Jag trodde det fanns någon bra sån metod som användes i alla Wikis runtomkring på nätet. Men jag får väl ta och spana vidare.

254 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)