2013-08-19 5 views
9

Ich verwende MapDB in einem Projekt, das sich mit Milliarden von Objekten beschäftigt, die zugeordnet/in eine Warteschlange gestellt werden müssen. Ich brauche keine Persistenz nach dem Programmende (die MapDB-Datenbanken sind alle temporär). Ich möchte, dass das Programm so schnell wie möglich läuft, aber ich bin verwirrt über die commit() -Funktion von MapDB (von der ich annehme, dass sie für die Performance relevant ist), selbst nach dem Lesen der docs. Meine Fragen:MapDB effizient verwenden (über Commits verwirrt)

  1. Was genau macht commit? Mein Arbeitsverständnis ist, dass es Objekte von dem Heap auf die Festplatte serialisiert und dadurch Speicherplatz freigibt. Ist das genau?

  2. Was passiert mit den Verweisen auf Objekte, die gerade übergeben wurden? Haben sie bekommen durch GC gereinigt, oder tun sie irgendwie ‚Referenz‘ ein Objekt auf der Festplatte (mit MapDB diese transparent zu machen?)

Letztlich möchte ich wissen, wie MapDB verwenden so effizient wie ich kann, aber Ich kann das nicht tun, ohne zu wissen, was commit() ist. Ich würde mich über jeden anderen Rat freuen, den Sie haben könnten, um MapDB effizient zu nutzen.

Antwort

2

Die commit Operation ist eine Operation auf transactions, genau wie Sie in einem Datenbanksystem finden würden. MapDB implementiert Transaktionen, so dass commit effektiv 'die Änderungen, die ich an dieser DB vorgenommen habe, dauerhaft und für andere Benutzer sichtbar machen'. Die komplementäre Operation ist rollback, die alle Änderungen zurückweist, die Sie innerhalb der aktuellen Transaktion vorgenommen haben. Commit beeinflusst nicht (direkt), was in der Erinnerung ist und was nicht. Möglicherweise möchten Sie stattdessen compact() anzeigen, wenn Sie versuchen, den Heapspeicherplatz freizugeben.

Für Ihre zweite Frage, wenn Sie eine starke Referenz auf ein Objekt halten, dann halten Sie diese starke Referenz. MapDB wird es nicht für dich löschen. Sie sollten MapDB die meiste Zeit als normale Java-Map betrachten. Wenn Sie get aufrufen, versteckt MapDB, ob es sich im Speicher oder auf der Festplatte befindet, und gibt Ihnen nur einen verwendbaren Verweis auf das abgerufene Objekt zurück. Das abgerufene Objekt bleibt im Speicher hängen, bis es wie alles andere zu Müll wird.