Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 2

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

Ответ 3

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

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

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