Python bardzo duży zestaw. Jak uniknąć wyjątku braku pamięci?

Używam kolekcji zestawów Pythona do przechowywania unikalnych obiektów. Każdy obiekt ma__hash__ i__eq__ zastąpiony.

Zestaw zawiera blisko 200 000 obiektów. Sam zestaw zajmuje około 4 GB pamięci. Działa dobrze na komputerze z ponad 5 GB, ale teraz muszę uruchomić skrypt na maszynie, która ma tylko 3 GB pamięci RAM.

Przepisałem skrypt na C # - faktycznie odczytałem te same dane z tego samego źródła, umieściłem je w analogowym zestawie CLR zestawu (HashSet) i zamiast 4 GB zajęło blisko 350 MB, podczas gdy szybkość wykonywania skryptu była stosunkowo taka sama ( blisko 40 sekund) Ale muszę używać Pythona.

P1: Czy Python ma jakiś zestaw „trwałych dysków” lub inne obejście? Domyślam się, że może przechowywać w pamięci tylko „kluczowe” dane używane w metodach mieszania / eq i wszystko inne można utrwalić na dysku. Lub może istnieją inne obejścia w Pythonie, aby mieć unikalną kolekcję obiektów, która może wymagać więcej pamięci niż dostępna w systemie.

P2: mniej praktyczne pytanie: dlaczego zestaw Pythona zajmuje dużo więcej pamięci na zestaw?

Używam standardowego Pythona 2.7.3 na 64-bitowym Ubuntu 12.10

Dziękuję Ci.

Aktualizacja1: Jaki skrypt:

Przeczytaj wiele półstrukturalnych dokumentów JSON (każdy JSON składa się z serializowanego obiektu z kolekcją powiązanych obiektów)

Analizuj każdy dokument JSON, aby pobrać z niego główny obiekt i obiekty z zagregowanych kolekcji. Każdy analizowany obiekt jest przechowywany w zestawie. Zestaw służy wyłącznie do przechowywania unikalnych obiektów. Najpierw użyłem bazy danych, ale unikalne ograniczenie w bazie danych działa wolniej x100-x1000. Każdy dokument JSON jest analizowany do 1-8 różnych typów obiektów. Każdy typ obiektu jest przechowywany w swoim własnym zestawie, aby zapisać w pamięci tylko unikalne obiekty.

Wszystkie dane przechowywane w zestawach są zapisywane w relacyjnej bazie danych z unikalnymi ograniczeniami. Każdy zestaw jest przechowywany w osobnej tabeli bazy danych.

Cała idea skryptu do pobierania danych nieustrukturyzowanych, usuwania duplikatów z zagregowanych kolekcji obiektów w dokumencie JSON i przechowywania danych strukturalnych w relacyjnej bazie danych.

Aktualizacja 2:

2 delnan: Skomentowałem wszystkie wiersze kodu dodając do innych zestawów, zachowując wszystkich innych pracowników (pobieranie danych, parsowanie, iterowanie) tak samo - skrypt zabrał 4 GB mniej pamięci.

Oznacza to, że gdy te 200K obiektów są dodawane do zestawów - zaczynają one zabierać tyle pamięci. Obiekt to proste dane filmowe z TMDB - ID, lista gatunków, lista aktorów, reżyserów, wiele innych szczegółów filmu i możliwie duży opis filmu z Wikipedii.

questionAnswers(3)

yourAnswerToTheQuestion