Diese Frage stammt von hier .
Ich habe drei große Listen mit Python-Objekten ( l1
, l2
und l3
). Diese Listen werden beim Start des Programms erstellt und benötigen insgesamt 16 GB RAM. Das Programm wird ausschließlich unter Linux verwendet.
Ich muss diese Listen oder die Objekte in diesen Listen nach ihrer Erstellung in keiner Weise ändern. Sie müssen im Speicher bleiben, bis das Programm beendet wird.
Ich benutze os.fork () und Multiprocessing-Modul in meinem Programm, um mehrere Unterprozesse zu erzeugen (bis zu 20 derzeit). Jeder dieser Teilprozesse muss in der Lage sein, die drei Listen ( l1
, l2
und l3
) zu lesen.
Mein Programm funktioniert ansonsten gut und ziemlich schnell. Ich habe jedoch Probleme mit dem Speicherverbrauch. Ich hatte gehofft, dass jeder Unterprozess die drei Listen verwenden kann, ohne sie aufgrund des Copy-on-Write-Ansatzes unter Linux in den Speicher zu kopieren. Dies ist jedoch nicht der Fall, da die Referenzierung eines Objekts in einer dieser Listen die zugehörigen Ref-Counts erhöht und daher die gesamte Speicherseite kopiert.
Also meine Frage wäre:
Kann ich die Referenzzählung für l1
, l2
und l3
und alle Objekte in diesen Listen deaktivieren? Das gesamte Objekt (einschließlich Metadaten wie z. B. ref count) wird grundsätzlich schreibgeschützt, so dass es unter keinen Umständen geändert wird (dies würde, so nehme ich an, mir erlauben, Copy-on-Write zu nutzen) / p>
Momentan befürchte ich, dass ich gezwungen bin, zu einer anderen Programmiersprache zu wechseln, um diese Aufgabe zu erledigen, wegen eines "Merkmals" (zählend), das ich momentan nicht brauche, aber was mir immer noch aufgezwungen wird und unnötige Probleme verursacht / p>
Sie können nicht, reference counting ist fundamental für CPython (die Referenzimplementierung und die, die Sie verwenden). Die Verwendung von Methoden für Objekte, die dazu führen, dass Referenzzählungen geändert werden, Elementabonnements oder der Zugriff auf Attribute führen dazu, dass Objekte hinzugefügt und aus dem Stapel entfernt werden, die Referenzzählungen usw. verwenden. Sie können das nicht umgehen.
Wenn sich der Inhalt der Listen nicht ändert, verwenden Sie stattdessen tuple()
s. Das wird die Tatsache nicht ändern, dass sie trotzdem refcounted werden.
Andere Implementierungen von Python (Jython (mit der Java Virtual Machine), IronPython (eine .NET-Runtime-Sprache) oder PyPy (Python in Python implementiert, aber experimentieren mit JIT und anderen Compiler-Techniken) können verschiedene Speichermethoden verwenden Management und kann oder möglicherweise nicht Ihr Gedächtnisproblem lösen.
Tags und Links python refcounting