Как сохранить объект Python в памяти для использования различными процессами? - PullRequest
12 голосов
/ 12 декабря 2011

Вот ситуация: у меня есть массивный объект, который нужно загрузить в память.Настолько большой, что если он будет загружен дважды, он выйдет за пределы доступной памяти на моей машине (и нет, я не могу обновить память).Я также не могу разделить это на более мелкие части.Для простоты, давайте просто скажем, что объект 600 МБ, и у меня есть только 1 ГБ оперативной памяти.Мне нужно использовать этот объект из веб-приложения, которое выполняется в нескольких процессах, и я не контролирую, как они создаются (это делает сторонний балансировщик нагрузки), поэтому я не могу полагаться только на создание объектав некотором главном потоке / процессе, а затем порождая детей.Это также исключает возможность использования чего-то вроде POSH, потому что это зависит от его собственного пользовательского вызова fork.Я также не могу использовать что-то вроде базы данных памяти SQLite, mmap или модулей posix_ipc, sysv_ipc и shm, потому что они действуют как файл в памяти, и эти данные должны быть объектом, чтобы я мог их использовать.Используя один из них, мне пришлось бы прочитать его как файл, а затем превратить его в объект в каждом отдельном процессе и BAM, ошибка сегментации из-за превышения лимита памяти машины, потому что я просто попытался загрузить вторую копию.

Должно быть какое-то место для хранения объекта Python в памяти (а не в виде файла / строки / сериализованного / маринованного) и чтобы он был доступен из любого процесса.Я просто не знаю что это.Я просмотрел все StackOverflow и Google и не могу найти ответ на этот вопрос, поэтому надеюсь, что кто-нибудь мне поможет.

Ответы [ 3 ]

4 голосов
/ 12 декабря 2011

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

Поиск общей памяти или процесса сервера.После перечитывания вашего поста серверный процесс звучит ближе к тому, что вы хотите.

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

2 голосов
/ 12 декабря 2011

Должно быть какое-то место для сохранения объекта Python в памяти (а не в виде файла / строки / сериализации / маринования) и чтобы он был доступен из любого процесса.

То естьПуть в работах.Подсчет ссылок на объекты Python и внутренние указатели объекта не имеют смысла для нескольких процессов.

Если данные не обязательно должны быть фактическими объектами Python, вы можете попробовать поработать с необработанными данными, хранящимися в mmap ().или в базе данных или что-то подобное.

1 голос
/ 12 декабря 2011

Я бы реализовал это как модуль C, который импортируется в каждый скрипт Python.Тогда интерфейс к этому большому объекту будет реализован на C или в некоторой комбинации C и Python.

...