2010-09-03 23 views
8

Me pregunto si es posible que el paquete ctypes interactúe con mmap.Python, ctypes y mmap

Actualmente, mi módulo asigna un búfer (con create_string_buffer) y luego lo pasa usando byref a la función de mis bibliotecas mylib.read. Esto, como su nombre sugiere, lee datos en el búfer. Luego llamo al file.write(buf.raw) para escribir los datos en el disco. Mis puntos de referencia, sin embargo, muestran que está lejos de ser óptimo (el tiempo pasado en file.write es mejor tiempo invertido en mylib.read).

Por lo tanto, me interesa saber si los ctypes pueden interoperar con mmap. Dada una instancia de mmap.mmap y un desplazamiento, ¿cómo puedo obtener un puntero (c_void_p) en el espacio de direcciones?

+0

Python tiene un módulo [mmap] (http://docs.python.org/library/mmap.html). – Seth

+1

@Seth la instancia 'mmap.mmap' a la que me refería es de ese módulo. Deseo saber cómo las instancias de este pueden interactuar con ctypes. –

+0

¿Estás seguro de que deberías estar haciendo esto en Python? Los malabares de puntero de bajo nivel se adaptan mejor a C o su tipo. Tampoco es demasiado difícil escribir módulos C para una buena interfaz con Python. – katrielalex

Respuesta

10

Un mmap objeto "es compatible con la interfaz de memoria intermedia se puede escribir", por lo tanto, se puede utilizar el método from_buffer clase, que todos ctypes clases tienen, con el mmap ejemplo como argumento, para crear un objeto ctypes al igual que lo desee, es decir, compartiendo la memoria (y por lo tanto el archivo subyacente) que la instancia mmap ha mapeado. Me imagino, en específico, que querrás un adecuado ctypesarray.

+0

Un excelente ejemplo de esto: https://github.com/serdardalgic/Code_Snippets/blob/master/Python-Examples/mmap/shared_memory_write.py –

1

Tenga en cuenta que el sistema operativo va a hacer readahead para read() de todos modos. Vas a estar bloqueando ya sea en lectura() o escritura(): una u otra bloquearán la operación, pero a pesar de que estás bloqueando en una, eso no significa que la otra no esté teniendo lugar. para ti detrás de las escenas. Ese es el trabajo de cada sistema operativo multitarea.

Si usa mmap para esto, es muy probable que haga las cosas más complicadas para el sistema operativo, haciendo que sea más difícil para determinar que realmente solo está transmitiendo datos entrando y saliendo, y haciéndolo más complicado para es para leer por adelantado. Todavía puede resolverlo (los sistemas operativos son muy buenos para esto), pero probablemente no estés ayudando.

El único beneficio en principio es evitar el costo de una copia de memoria, pero no suena como ese es su objetivo aquí (y a menos que los perfiles indiquen lo contrario, dudaría mucho de que eso ayude al rendimiento).

+1

mylibrary.read() interfaces con un dispositivo 1394 conectado, en cuyo punto el bus de E/S del sistema está completamente inactivo. Antes de preguntar, pirateé el mismo bucle en C sin formato y comparé el mmap con read()/write(). mmap fue ~ 50% más rápido. –