2012-07-02 37 views
10

Estoy tratando de encontrar una forma de compartir memoria entre procesos de python. Básicamente, existen objetos que existen que múltiples procesos de python deben poder LEER (solo leer) y usar (sin mutación). En este momento esto se implementa usando redis + cadenas + cPickle, pero cPickle ocupa un tiempo de CPU precioso, por lo que me gustaría no tener que usar eso. La mayoría de las implementaciones de memoria compartida de python que he visto en los internets parecen requerir archivos y pepinillos, que es básicamente lo que estoy haciendo y exactamente lo que estoy tratando de evitar.Memoria compartida entre procesos de python

Lo que me pregunto es si habría una manera de escribir un tipo ... básicamente una base de datos/servidor de objetos en python en memoria y un módulo C correspondiente para interactuar con la base de datos?

Básicamente, el módulo C le pediría al servidor una dirección para escribir un objeto, el servidor respondería con una dirección, luego el módulo escribiría el objeto y notificaría al servidor que se escribió un objeto con una clave dada al disco en la ubicación especificada. Luego, cuando cualquiera de los procesos quería recuperar un objeto con una clave dada, simplemente le pedía a la base de datos la ubicación de la memoria para la clave dada, el servidor respondería con la ubicación y el módulo sabría cómo cargar ese espacio en la memoria y transfiere el objeto python nuevamente al proceso python.

¿Es totalmente irrazonable o realmente muy difícil de implementar? ¿Estoy persiguiendo algo que es imposible? Cualquier sugerencia será bienvenida. Gracias internet.

+1

¿Qué tan valioso es el tiempo de su CPU que vale la pena descargar una solución de trabajo que sea mucho menos complicada de mantener sincronizada de lo que está proponiendo? Lo que está pidiendo se puede hacer, pero será un gran dolor en el culo hacer * correctamente *. – millimoose

+0

El tiempo de CPU es el más preciado. Básicamente, desatornillar objetos puede tomar desde 20 ms (para uno pequeño) hasta 60 ms (para uno grande). Personalmente siento que estos dos tiempos son demasiado largos. EDITAR: Demasiado tiempo en el sentido de que tiene que haber una manera mejor, no es que creo que cPickle no se esfuerce lo suficiente. – nickneedsaname

+0

Compartir la memoria sería factible, pero compartir objetos será muy difícil ... Puede encontrar una pregunta relacionada aquí: http://stackoverflow.com/questions/1268252/python-possible-to-share-in-memory-data -entre-2-procesos-separados (hay una buena reseña de Alex Martelli que explica por qué es difícil). – ChristopheD

Respuesta

5

No es razonable.

IPC se puede hacer con un archivo de memoria asignada. Python ha incorporado la funcionalidad en:

http://docs.python.org/library/mmap.html

Sólo mmap el archivo en ambos procesos y oye-presto usted tiene un archivo compartido. Por supuesto, tendrá que sondearlo en ambos procesos para ver qué cambios. Y tendrá que cooperar escribe entre ambos. Y decida en qué formato desea ingresar sus datos. Pero es una solución común a su problema.

+6

Pero esto aún requeriría la serialización en bytes, ¿sí? El OP dijo que estaba tratando de evitar eso. –

+0

Esto sería algún tipo de serialización, sí. Tal vez la serialización personalizada haría un mejor trabajo si se conoce el tipo de objeto. Alternativamente, incluya un código hash para evitar volver a deserializar un objeto dos veces. Sin embargo, esto se hace, se requiere serialización. – Joe

+0

Sin serialización :( – nickneedsaname

3

Si no desea decapado, multiprocessing.sharedctypes podría caber. Aunque es un poco de bajo nivel; obtienes valores individuales o matrices de tipos especificados.

Otra forma de distribuir datos a procesos secundarios (una vía) es multiprocessing.Pipe. Eso puede manejar objetos de Python, y está implementado en C, por lo que no puedo decir si usa decapado o no.

Cuestiones relacionadas