2011-12-12 20 views
10

Aquí está la situación: tengo un objeto masivo que debe cargarse en la memoria. Tan grande que si se carga en dos veces irá más allá de la memoria disponible en mi máquina (y no, no puedo actualizar la memoria). Tampoco puedo dividirlo en pedazos más pequeños. Por simplicidad, digamos que el objeto es de 600 MB y solo tengo 1 GB de RAM. Necesito usar este objeto desde una aplicación web, que se ejecuta en múltiples procesos, y no controlo cómo se genera (un equilibrador de carga externo lo hace), así que no puedo confiar solo en crear el objeto en algún hilo/proceso maestro y luego desovando de los niños. Esto también elimina la posibilidad de usar algo como POSH porque se basa en su propia llamada tenedor personalizada. Tampoco puedo usar algo como una base de datos de memoria SQLite, mmap o los módulos posix_ipc, sysv_ipc y shm porque esos actúan como un archivo en la memoria, y estos datos tienen que ser un objeto para mí para usarlos. Usando uno de ellos, tendría que leerlo como un archivo y luego convertirlo en un objeto en cada proceso individual y BAM, la falla de segmentación sobrepasaría el límite de memoria de la máquina porque intenté cargar una segunda copia.¿Cómo almaceno un objeto Python en la memoria para que lo usen los diferentes procesos?

Debe haber alguna manera de almacenar un objeto Python en la memoria (y no como un archivo/cadena/serializado/en escabeche) y tenerlo accesible desde cualquier proceso. Simplemente no sé qué es. He buscado en todo StackOverflow y Google y no puedo encontrar la respuesta a esto, así que espero que alguien me pueda ayudar.

+0

No estoy seguro de lo que quiere decir con "porque esos actúan como un archivo en la memoria". La memoria compartida es una pieza de memoria, no un archivo. Puede usar esa memoria para almacenar cualquier cosa, incluso un objeto. Esto podría no ser tan obvio en Python, pero en C sí lo es. ¿Tiene que ser una solución solo de Python, o considerará una solución híbrida de Python/C o Python/C++ para acceder indirectamente al objeto a través de enlaces C/C++ a un objeto en la memoria compartida? –

+0

Como esas cosas actúan como archivos en la memoria, vea http://docs.python.org/library/mmap.html por ejemplo. –

+1

¿Ayudaría algo así como Memcached para Python? – doremi

Respuesta

4

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

Look para la memoria compartida, o el proceso del servidor. Después de volver a leer su publicación, el proceso del servidor suena más cercano a lo que desea.

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

+0

En la parte inferior de la sección Proceso de servidor está esto: "Los administradores de procesos de servidor son más flexibles que los objetos de memoria compartida porque pueden hacerse para admitir tipos de objetos arbitrarios. Además, un solo administrador puede ser compartido por procesos en diferentes computadoras sobre una red ". Eso es extremadamente interesante y potencialmente es exactamente lo que necesito, pero parece que no puedo encontrar una buena documentación sobre cómo hacerlo. La búsqueda del "proceso del servidor python" produce resultados vagos. ¿Conoces algún buen recurso? – Brendan

+0

En respuesta a mi último comentario, en realidad está en una sección diferente en la misma página: http://docs.python.org/library/multiprocessing.html#multiprocessing.managers.BaseManager.connect Awesome! Eso va a funcionar totalmente para mí. – Brendan

1

Me gustaría poner en práctica esto como un módulo C que consigue importado en cada secuencia de comandos de Python. Entonces la interfaz para este objeto grande se implementaría en C, o en alguna combinación de C y Python.

1

Tiene que haber alguna manera de almacenar un objeto de Python en la memoria (y no como un archivo/cadena/serializado/escabeche) y tiene que ser accesible desde cualquier proceso .

Ese no es el camino en las obras. El recuento de referencias de objetos Python y los punteros internos de un objeto no tienen sentido en múltiples procesos.

Si los datos no tienen por qué ser un objeto Python real, puede intentar trabajar en los datos brutos almacenados en mmap() o en una base de datos o algo así.

Cuestiones relacionadas