Oto sytuacja: Mam ogromny obiekt, który należy załadować do pamięci. Tak duży, że jeśli zostanie załadowany dwa razy, wyjdzie poza dostępną pamięć na mojej maszynie (i nie, nie mogę uaktualnić pamięci). Nie mogę również podzielić go na mniejsze kawałki. Dla dobra prostoty, powiedzmy, że obiekt to 600 MB i mam tylko 1 GB pamięci RAM. Muszę użyć tego obiektu z aplikacji internetowej, która działa w wielu procesach, a ja nie kontroluję, jak są spawane (równoważnik obciążenia stron trzecich), więc nie mogę polegać na tworzeniu obiektu W niektórych głównych wątkach / procesach, a następnie spawień z dzieci. Eliminuje to również możliwość korzystania z czegoś takiego jak Posh, ponieważ opiera się na własny niestandardowy telefon widłowy. Nie mogę również używać czegoś takiego jak bazy danych pamięci SQLite, MMAP lub Moduły Posix_IPC, SYSV_IPC i SHM, ponieważ te działają jako plik w pamięci, a dane te muszą być obiektem, aby go używać. Korzystanie z jednego z nich musiałbym przeczytać go jako plik, a następnie przekształcić go w obiekt w każdym procesie indywidualnym i bamie, usterka segmentacji od limitu pamięci urządzenia, ponieważ właśnie próbowałem załadować w drugiej kopii.

Musi być w inny sposób przechowywania obiektu Pythona w pamięci (a nie jako plik / łańcuch / serializowany / marynowany) i ma być dostępny z dowolnego procesu. Po prostu nie wiem, co to jest. Wyglądałem na stackoverflow i google i nie mogę znaleźć odpowiedzi, więc mam nadzieję, że ktoś może mi pomóc.

12
Brendan 12 grudzień 2011, 06:24

3 odpowiedzi

Najlepsza odpowiedź

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

Szukaj wspólnej pamięci lub procesu serwera. Po ponownym przeczytaniu procesu serwera pocztowego brzmi bliżej tego, co chcesz.

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

4
Derek Litz 12 grudzień 2011, 02:44

Zaimplementowałbym to jako moduł C, który zostanie przywieziony do każdego skryptu Pythona. Następnie interfejs do tego dużego obiektu byłoby wdrożone w C lub jakiejś kombinacji C i Pythona.

1
Gabe 12 grudzień 2011, 03:08

Musi być w inny sposób przechowywania obiektu Pythona w pamięci (a nie jako plik / łańcuch / serializowany / marynowany) i ma być dostępny z dowolnego procesu.

To nie jest sposób w pracach. Odliczanie odniesienia obiektu Pythona i wewnętrzne wskaźniki obiektu nie mają sensu na wielu procesach.

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

2
Raymond Hettinger 12 grudzień 2011, 03:09