2010-12-01 12 views
4

Ich bin mit der Folge zu öffnen:In Kyoto Cabinet Database mit File Hash Database, wie kann Dateigröße erhöhen vermeiden?

db.open("db.kch#tune_defrag=10000", DB.OWRITER | DB.OCREATE) 

Ich stelle und Elemente zu entfernen. Am Ende der Ausführung ist die Datenbank "leer", die Funktion count() gibt 0 zurück, weil ich alle Elemente entfernt habe. Warum nimmt die Dateigröße immer zu, wenn ich den Test wiederhole? Ist es möglich, etwas wie "Garbage Collector" auszuführen, um die entfernten Register zu bereinigen? Wenn ich den gleichen Test 100 mal ausführe, habe ich eine 500 MB große Datenbank, sogar ich habe nur 2 Datensätze.

Ich habe versucht, die "tune_defrag = 10000", aber ich denke, es hat nicht gut funktioniert.

Obs .: ein einziges Register ist weniger als 1K, ich verstehe nicht, warum die Register so viel Platz auf der Festplatte nehmen.

Vielen Dank für jede Hilfe

Antwort

-1

Von einem flüchtigen Blick durch die kyoto Dokumentation scheint es nicht, dass Sie keine Möglichkeit haben, die Datenbank von gelöschten Datensätze, um die Größe oder anderweitig zu reinigen ... oder wirklich in jedem zu verwalten Weg Form oder Form.

Dieses Projekt sieht so aus, als wäre es noch lange nicht "produktionsfertig". Wenn Sie es wirklich implementieren möchten, würde ich vorschlagen, die Projekteigentümer (http://fehlabs.com/) zu kontaktieren und zu sehen, ob sie Pläne für einige dringend benötigte Utility-Funktionen haben.

Andernfalls würde ich vorschlagen, in eine andere Nosql-Stil-Datenbank zu verschieben, die ein bisschen reifer ist.

+0

Sorry, ich glaube wirklich nicht. –

+0

@Spamkids: Denke nicht darüber nach, welchen Teil? (versuche nur zu verstehen). – NotMe

+0

Ich habe hier einige Tests gemacht und ich habe eine interessante Tatsache herausgefunden: Wenn ich den Prozess (mit kill oder kill -9) abbringe, wenn ich die Datenbank zurückhalte, ist sie sehr klein. Weil die Datenbank ihre "automatische Wiederherstellung" wie in der offiziellen Dokumentation erwähnt aktiviert hat. Ich habe eine interne Variable gesehen und die "reorganisiert" wird auf 1 gesetzt (wenn ich alles sanft schließe, war es immer 0). Also, ich denke, es ist möglich, etwas wie eine Reorganisation zu erzwingen. Ich weiß einfach nicht wie. Es ist kein unlösbares Problem, da bin ich mir fast sicher.Ich habe einfach nicht herausgefunden, wie ich es lösen soll. –

1

Ich habe diese bestimmte db nicht verwendet, aber in einigen anderen ist ein Hack, um dieses Problem zu beheben, die db in eine neue zu kopieren und dann die alte zu löschen. Nachdem sichergestellt wurde, dass es gut kopiert :).

Ich habe diesen Prozess in Produktionssysteme implementiert, solange es wirklich wirklich gut codiert ist, sollte es funktionieren.

+0

hahah, sehr kreative Lösung! es scheint zu funktionieren, aber es ist ein bisschen dreckig, oder? –

3

Versuchen Sie folgendes:

db.kch#dfunit=8 

Das bedeutet, dass der KC läuft defrag für jede 8 Fragmentierung erkannt und 8 wird tatsächlich von Mikio empfohlen.

Die verfügbaren Optionen sind hier aufgelistet, könnten jedoch etwas polieren.

http://fallabs.com/kyotocabinet/command.html

+0

Vielen Dank. Ich werde es versuchen. –

2

Lauf:

kchashmgr defrag path_to_kcabinet_file

ist, was ich tun, um die Datenbankdatei 'verkleinert' zu erhalten. Ich habe den API-Zugang dazu nicht gefunden, deshalb mache ich es mit einem Shell-Befehl, der das kchashmgr-Dienstprogramm verwendet (offensichtlich kann dies von innerhalb eines Programms aufgerufen werden).