2011-06-09 21 views
5

Creo que tengo el problema opuesto al descrito here. Tengo un proceso escribiendo datos en un registro, y quiero un segundo proceso para leerlo, pero no quiero que el segundo proceso pueda modificar los contenidos. Este es potencialmente un archivo grande, y necesito acceso aleatorio, entonces estoy usando el módulo mmap de python.Python mmap ctypes - solo lectura

Si creo el mmap como de lectura/escritura (para el segundo proceso), no tengo ningún problema para crear el objeto ctypes como una "vista" del objeto mmap usando from_buffer. Desde una mirada superficial al código c, parece que este es un molde, no una copia, que es lo que quiero. Sin embargo, esto se rompe si hago mmap ACCESS_READ, lanzando una excepción que from_buffer requiere privilegios de escritura.

I think Quiero utilizar el método ctypes from_address() en su lugar, que no parece necesitar acceso de escritura. Probablemente me esté perdiendo algo simple, pero no estoy seguro de cómo obtener la dirección de la ubicación dentro de un mmap. Sé que puedo usar ACCESS_COPY (para que las operaciones de escritura aparezcan en la memoria, pero no se conserven en el disco), pero prefiero mantener las cosas solo de lectura.

¿Alguna sugerencia?

+0

Si está utilizando el módulo python mmap, ¿por qué necesita crear un objeto ctypes? – tMC

+0

El registro no es solo texto, incluye estructuras de datos que he asignado a la clase de estructura Ctypes. Así que voy a mapear la memoria a los diversos tipos de Estructura, y usar eso para acceder a los subelementos y tomar decisiones sobre cómo procesar diferentes partes del registro. –

Respuesta

0

Ok, al mirar el código mc .c, no creo que sea compatible con este caso de uso. Además, descubrí que el rendimiento es una mierda, en mi caso de uso. Me gustaría saber qué tipo de interpretación ven los demás, pero descubrí que tardó unos 40 segundos en recorrer un archivo binario de 500 MB en Python. Esto es crear un mmap, luego convertir la ubicación en un objeto ctype con from_buffer(), y usar el objeto ctypes para descifrar el tamaño del objeto para poder pasar al siguiente objeto. Intenté hacer lo mismo directamente en C++ desde msvc. Obviamente, aquí podría lanzar directamente a un objeto del tipo correcto, y fue rápido, menos de un segundo (esto es con un core 2 quad y ssd).

Me pareció que podía obtener un puntero con el siguiente

firstHeader = CEL_HEADER.from_buffer(map, 0) #CEL_HEADER is a ctypes Structure 
pHeader = pointer(firstHeader) 
#Now I can use pHeader[ind] to get a CEL_HEADER object 
#at an arbitrary point in the file 

Esto no quiere moverse por el problema original - MMAP no es de sólo lectura, ya que todavía tengo que usar para from_buffer la primera llamada. En esta configuración, aún tardó alrededor de 40 segundos en procesar todo el archivo, por lo que parece que la conversión de un puntero a estructuras de tipo ctypes está acabando con el rendimiento. Eso es solo una suposición, pero no veo mucho valor en rastrearlo más.

No estoy seguro si mi plan ayudará a alguien más, pero voy a tratar de crear un módulo c específico para mis necesidades basado en el código mmap. Creo que puedo usar el manejo rápido de código c para indexar el archivo binario y luego exponer solo pequeñas partes del archivo a la vez mediante llamadas a objetos ctypes/python. Deséame suerte.

Además, como nota al margen, Python 2.7.2 fue lanzado hoy (12/06/11), y uno de los cambios es una actualización del código mmap para que pueda usar una python para establecer el archivo compensar. Esto le permite usar mmap para archivos de más de 4 GB en sistemas de 32 bits. Consulte el problema n.º 4681 here

0

Me encontré con un problema similar (no se puede configurar un mmap de solo lectura) pero solo estaba usando el módulo mmap de python. Python mmap 'Permission denied' on Linux

No estoy seguro de que sea de alguna ayuda ya que no desea que el mmap sea privado?

+0

No tengo ningún problema para abrir y acceder al archivo a través de mmap. El problema es que from_buffer() arroja una excepción si el buffer no puede escribirse, entonces necesito una alternativa a esa llamada. –