Python sehr großes Set. Wie vermeide ich eine Speicherausnahme?

Ich verwende eine Python-Set-Sammlung, um eindeutige Objekte zu speichern. Jedes Objekt hat__hash__ und__eq__ überschrieben.

Das Set enthält fast 200 000 Objekte. Das Gerät selbst benötigt fast 4 GB Speicher. Es funktioniert einwandfrei auf Computern mit mehr als 5 GB, aber jetzt muss das Skript auf einem Computer ausgeführt werden, auf dem nur 3 GB RAM verfügbar sind.

Ich habe ein Skript in C # umgeschrieben - tatsächlich dieselben Daten aus derselben Quelle gelesen, in ein CLR-Analogon von set (HashSet) gestellt und statt 4 GB fast 350 MB benötigt, während die Geschwindigkeit der Skriptausführung relativ gleich war ( in der Nähe von 40 Sekunden) Aber ich muss Python verwenden.

F1: Verfügt Python über einen "disk persistent" -Satz oder eine andere Problemumgehung? Ich vermute, dass es im Speicher nur "Schlüsseldaten" speichern kann, die in Hash / EQ-Methoden verwendet werden, und alles andere kann auf der Festplatte gespeichert werden. Oder es gibt andere Problemumgehungen in Python, um eine eindeutige Sammlung von Objekten zu haben, die möglicherweise mehr Speicher benötigen als im System verfügbar sind.

F2: weniger praktische Frage: Warum benötigt Python-Set so viel mehr Speicher für ein Set?

Ich benutze Standard Python 2.7.3 auf 64 Bit Ubuntu 12.10

Vielen Dank.

Update1: Welches Skript macht:

Lesen Sie viele semistrukturierte JSON-Dokumente (jedes JSON besteht aus einem serialisierten Objekt mit einer Sammlung zugehöriger aggregierter Objekte).

Analysieren Sie jedes JSON-Dokument, um das Hauptobjekt und die Objekte aus aggregierten Sammlungen abzurufen. Jedes analysierte Objekt wird in einer Menge gespeichert. Set wird nur zum Speichern eindeutiger Objekte verwendet. Zuerst habe ich eine Datenbank verwendet, aber die eindeutige Einschränkung in der Datenbank funktioniert x100-x1000 langsamer. Jedes JSON-Dokument wird in 1-8 verschiedene Objekttypen analysiert. Jeder Objekttyp wird in einem eigenen Satz gespeichert, um nur eindeutige Objekte zu speichern.

Alle in Sätzen gespeicherten Daten werden mit eindeutigen Einschränkungen in einer relationalen Datenbank gespeichert. Jeder Satz wird in einer separaten Datenbanktabelle gespeichert.

Die gesamte Idee des Skripts besteht darin, unstrukturierte Daten zu erfassen, Duplikate aus aggregierten Objektsammlungen im JSON-Dokument zu entfernen und die strukturierten Daten in einer relationalen Datenbank zu speichern.

Update 2:

2 delnan: Ich habe alle Codezeilen mit dem Hinzufügen zu einer anderen Gruppe kommentiert, wobei alle anderen Mitarbeiter (Abrufen von Daten, Parsen, Iterieren) gleich blieben. Das Skript beanspruchte 4 GB weniger Speicher.

Dies bedeutet, dass diese 200-KB-Objekte, wenn sie zu Gruppen hinzugefügt werden, so viel Speicher beanspruchen. Das Objekt sind einfache Filmdaten aus TMDB-ID, eine Liste von Genres, eine Liste von Schauspielern, Regisseuren, viele andere Filmdetails und möglicherweise eine große Filmbeschreibung aus Wikipedia.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage