2012-07-26 10 views
11

Me estoyIOError: [Errno 22] argumento no válido durante la lectura/escritura de gran cadena de bytes

IOError: [Errno 22] Invalid argument 

cuando trato de escribir una gran cadena de bytes en disco con f.write(), donde f se abrió con el modo wb.

He visto mucha gente en línea obtener este error cuando se utiliza una unidad de red de Windows, pero estoy en OSX (10.7 cuando originalmente hice la pregunta pero ahora 10.8, con un sistema de archivos HFS + local estándar). Estoy usando Python 3.2.2 (ocurre tanto en un binario python.org como en una instalación homebrew). No veo este problema con el sistema Python 2.7.2.

También probé el modo w+b basado en this Windows bug workaround, pero por supuesto que no sirvió.

Los datos proceden de una gran matriz numpy (casi 4 GB de flotantes). Funciona bien si bucle manualmente sobre la cadena y la escribo en fragmentos. Pero como no puedo escribir todo de una vez, fallan np.save y np.savez, ya que solo usan f.write(ary.tostring()). Aparece un error similar cuando intento guardarlo en un archivo HDF5 existente con h5py.

Tenga en cuenta que tengo el mismo problema cuando se lee un archivo abierto con file(filename, 'rb'): f.read() da este IOError, mientras que para f.read(chunk_size) razonables chunk_size obras.

¿Alguna idea?

+0

Weird. 'EINVAL' = 22, pero nada en [' man 2 write'] (https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man2/write.2.html) parece aplicable. ¿Puedes ejecutarlo bajo ['dtruss'] (http://developer.apple.com/documentation/Darwin/Reference/Manpages/man1/dtruss.1m.html) para comprobar si realmente está fallando la llamada de 'write'? – ephemient

+0

"Funciona bien si bifurco manualmente la cadena y la escribo en fragmentos". entonces ¿por qué no? ¿Qué tan grande de una porción de datos crees que deberías poder escribir a la vez? ¿Más de lo que puedes contar con un 'size_t'? – msw

+2

@msw Como dije, esto rompe 'np.save' y más importante para mí' h5py'. Obviamente, si lo hago manualmente, puedo escribir y lo hago en fragmentos, y funciona en 'h5py' si creo el conjunto de datos primero y escribo, digamos, 50 filas a la vez. Pero esto no debería ser necesario, como lo demuestra el hecho de que ambas bibliotecas no ven la necesidad de hacerlo. Y mis matrices son "solo" 500 millones de entradas (log_2 <29), que es direccionable por un int de 32 bits, y mucho menos un 'size_t'. – Dougal

Respuesta

7

Esto parece ser un error OSX general con fread/fwrite y por lo tanto no es realmente reparable por un usuario de Python. Ver numpy #3858, this torch7 commit, this SO question/answer, ....

Supuestamente se ha corregido en Mavericks, pero sigo viendo el problema.

Python 2 puede haber funcionado alrededor de esto o su módulo io puede tener siempre lecturas/escrituras grandes amortiguadas; No he investigado a fondo.

-2

Quizás intente no abrir con el indicador b, no creo que sea compatible con todos los sistemas de archivos/sistema operativo.

+0

El indicador 'b' es necesario para [modo binario] (http://docs.python.org/py3k/library/functions.html?highlight=open#open), que significa en python 3 que maneja bytes en lugar de cadenas. Lo que probablemente estés pensando es que 'b' no funcionaba en las plataformas Unix en Python 2, que ya no es el caso. – Dougal

+0

Además, solo para asegurarme, lo intenté (abriendo el archivo con el modo 'w' y haciendo' f.write (the_bytestring.decode ('latin1')) 'para generar un galimatías basado en la verdadera cadena de bytes; obtuve el mismo IOError 22. – Dougal

Cuestiones relacionadas