Ich versuche zu verstehen, wie PyTables Daten verwalten, deren Größe größer ist als die Speichergröße. Hier Kommentar in Code von PyTables (link to GitHub):PyTables, die mit Daten arbeiten, deren Größe um ein Vielfaches größer ist als die Größe des Speichers
# Nodes referenced by a variable are kept in `_aliveNodes`.
# When they are no longer referenced, they move themselves
# to `_deadNodes`, where they are kept until they are referenced again
# or they are preempted from it by other unreferenced nodes.
Auch nützliche Kommentare können innerhalb _getNode Methode gefunden werden.
Es scheint, als ob PyTables ein sehr intelligentes IO-Pufferungssystem haben, das, wie ich es verstehe, vom Benutzer referenzierte Daten im schnellen RAM als "aliveNodes" speichert und referenzierte Daten als "deadNodes" für eine schnelle "Wiederbelebung" bei Bedarf speichert , und liest Daten von der Festplatte, wenn der angeforderte Schlüssel nicht in den Kategorien tot oder lebendig vorhanden ist.
Ich brauche etwas Erfahrung darüber, wie genau PyTables mit Situationen umgehen, wenn mit Daten gearbeitet wird, die größer sind als der verfügbare Speicher. Meine spezifischen Fragen:
- Wie funktioniert deadNode/aliveNode System (allgemeines Bild)?
- Was ist der Hauptunterschied zwischen aliveNodes/deadNodes, während sie beide im RAM gespeicherten Daten darstellen, wenn im richtigen?
- Kann die RAM-Grenze für die Pufferung manuell angepasst werden? Unterhalb des Kommentars befindet sich Code, der einen Wert von
params['NODE_CACHE_SLOTS']
liest. Kann es irgendwie vom Benutzer angegeben werden? Zum Beispiel, wenn ich etwas RAM für andere Anwendungen, die auch Speicher benötigen, lassen möchte? - In welchen Situationen kann PyTables abstürzen oder erheblich verlangsamen, wenn mit großen Datenmengen von Daten gearbeitet wird? Kann in meinem Fall die Erinnerung um das 100-fache überschreiten, was sind häufige Fallstricke in solchen Situationen?
- Welchen Nutzen von PyTables in Bezug auf Größe, Struktur der Daten und Manipulationen mit Daten, die als "richtig" für das Erreichen der besten Leistung angesehen werden?
- Docs suggests Verwenden Sie
.flush()
nach jedem grundlegenden.append()
Zyklus. Wie lange kann dieser Zyklus tatsächlich sein? Ich führe einen kleinen Benchmark durch und vergleiche SQLite und PyTables, wie sie mit der Erstellung einer riesigen Tabelle mit Schlüssel/Wert-Paaren aus großen CSV-Dateien umgehen können. Und wenn ich.flush()
verwende, weniger häufig im Hauptzyklus, erhält PyTables enorme Beschleunigung. Also - ist es richtig, zu.append()
relativ großen Datenstücken, und dann.flush()
verwenden?
Sie können keinen Inhalt im Speicher speichern, der 100x Ihres verfügbaren Arbeitsspeichers ist. PyTables kann Ihnen jedoch helfen, auf die Daten in Chunks zuzugreifen oder Funktionen (manchmal) speichereffizient auf Ihre Daten anzuwenden. Was versuchen Sie mit Ihren Daten? – seandavi