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?
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
"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
@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