2011-12-12 9 views
10

Oto sytuacja: Mam ogromny obiekt, który musi zostać załadowany do pamięci. Tak duże, że jeśli zostanie załadowane dwa razy, wykroczy poza dostępną pamięć na moim komputerze (i nie, nie mogę zaktualizować pamięci). Nie mogę też podzielić tego na mniejsze. Dla uproszczenia, powiedzmy, że obiekt ma 600 MB i mam tylko 1 GB pamięci RAM. Muszę użyć tego obiektu z aplikacji sieciowej, która działa w wielu procesach i nie kontroluję tego, jak są one tworzone (równoważenie obciążenia stron trzecich to robi), więc nie mogę polegać tylko na tworzeniu obiektu w jakimś wątku/procesie nadrzędnym, a następnie spawnie dzieci. Eliminuje to również możliwość użycia czegoś takiego jak POSH, ponieważ opiera się on na własnym niestandardowym wywołaniu widelca. Nie mogę też użyć czegoś takiego jak baza danych SQLite, mmap lub posix_ipc, sysv_ipc i shm modules, ponieważ działają one jako plik w pamięci, a dane te muszą być dla mnie obiektem do użycia. Korzystając z jednego z nich, musiałbym odczytać go jako plik, a następnie przekształcić go w obiekt w każdym pojedynczym procesie i BAM, błąd segmentacji od przekroczenia limitu pamięci maszyny, ponieważ właśnie próbowałem załadować drugą kopię.Jak przechowywać obiekt Pythona w pamięci do użycia przez różne procesy?

Musi być gdzieś przechowywany obiekt Pythona w pamięci (a nie jako plik/ciąg/szeregowany/wytrawiony) i musi być dostępny z dowolnego procesu. Po prostu nie wiem, co to jest. Rozglądałem się po StackOverflow i Google i nie mogę znaleźć odpowiedzi na to, więc mam nadzieję, że ktoś może mi pomóc.

+0

Nie jestem pewien, co masz na myśli przez "ponieważ działają jako plik w pamięci". Pamięć współdzielona to pamięć, a nie plik. Możesz użyć tej pamięci do przechowywania czegokolwiek, łącznie z obiektem. To może nie być tak oczywiste w Pythonie, ale w C jest. Czy to musi być rozwiązanie tylko w języku Python, czy też rozważysz hybrydowe rozwiązanie Python/C lub Python/C++, aby uzyskać pośredni dostęp do obiektu poprzez powiązania C/C++ z obiektem we wspólnej pamięci? –

+0

Ponieważ te rzeczy działają jak pliki w pamięci, na przykład http://docs.python.org/library/mmap.html. –

+1

Czy coś takiego jak Memcached dla Pythona mogłoby w ogóle pomóc? – doremi

Odpowiedz

4

http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes

Look dla pamięci dzielonej lub Process Server. Po ponownym przeczytaniu postu proces serwera brzmi bliżej tego, co chcesz.

http://en.wikipedia.org/wiki/Shared_memory

+0

U dołu sekcji Proces serwera jest to: "Menedżer procesów serwera jest bardziej elastyczny niż obiekty pamięci współużytkowanej, ponieważ mogą one obsługiwać dowolne typy obiektów. Ponadto pojedynczy menedżer może być współużytkowany przez procesy na różnych komputerach przez sieć. " To jest bardzo interesujące i potencjalnie dokładnie to, czego potrzebuję, ale nie mogę znaleźć dobrej dokumentacji, jak to zrobić. Wyszukiwanie "procesu serwera Pythona" daje niejasne wyniki. Czy znasz jakieś dobre zasoby? – Brendan

+0

W odpowiedzi na mój ostatni komentarz jest to po prostu w innej sekcji na tej samej stronie: http://docs.python.org/library/multiprocessing.html#multiprocessing.managers.BaseManager.connect Awesome! To będzie dla mnie całkowicie skuteczne. – Brendan

1

chciałbym zaimplementować to jako moduł C, które są importowane do każdego skryptu Pythona. Wtedy interfejs do tego dużego obiektu byłby zaimplementowany w C, lub w pewnej kombinacji C i Python.

1

Musi być jakiś sposób, aby zapisać obiekt Pythona w pamięci (a nie jako pliku/String/serializowanym/marynowane) i mają być dostępne z dowolnego procesu .

To nie jest sposób w pracy. Zliczanie odwołań do obiektów Python i wewnętrzne wskaźniki obiektu nie mają sensu dla wielu procesów.

Jeśli dane nie muszą być rzeczywistymi obiektami Python, można spróbować pracować na surowych danych przechowywanych w mmap() lub w bazie danych lub somesuch.

Powiązane problemy