2012-07-26 85 views
11

当我得到IO错误:[错误22]读/写大字节字符串

IOError: [Errno 22] Invalid argument 

当我尝试写一个大的字节串到磁盘f.write(),其中f与模式wb打开参数无效。

我在网上看到很多人在使用Windows网络驱动器时出现这个错误,但是我在OSX上(当我最初问这个问题的时候是10.7,而现在是一个标准的HFS +本地文件系统的时候是10.8)。我正在使用Python 3.2.2(发生在python.org二进制文件和自制软件安装上)。我没有看到系统Python 2.7.2的这个问题。

我也试过模式w+b根据this Windows bug workaround,但当然这并没有帮助。

数据来自一个大的numpy数组(几乎是4GB的浮点数)。它工作正常,如果我手动循环的字符串,并把它写出来块。但是因为我无法一次写完全部,所以np.savenp.savez失败 - 因为它们只是使用f.write(ary.tostring())。当我尝试将其保存到与h5py一个现有的HDF5文件时,我收到类似的错误。

注意阅读与file(filename, 'rb')打开一个文件时,我得到了同样的问题:f.read()给出了这样的IOError,而f.read(chunk_size)合理chunk_size作品。

有什么想法?

+0

奇怪。 'EINVAL' = 22,但['man 2 write'](https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man2/write.2.html)中没有任何内容适用。你可以运行['dtruss'](http://developer.apple.com/documentation/Darwin/Reference/Manpages/man1/dtruss.1m.html)来检查它是否真的是'写'系统调用失败? – ephemient 2012-07-29 05:19:51

+0

“如果我手动在字符串上循环并将其写入块中,它工作正常。”那为什么不呢?您认为您应该能够一次编写多大的数据?你可以用'size_t'来计算吗? – msw 2012-07-29 05:39:41

+2

@msw就像我说的,这打破了'np.save',更重要的是我'h5py'。很显然,如果我手动完成这项工作,我可以并且确实将它写入块中,并且如果我先创建数据集并一次写入50行,那么它可以在'h5py'中运行。但这不应该是必要的,正如证明这些图书馆没有看到需要这样做的事实。而我的数组“只有”5亿个条目(log_2 <29),可以通过32位的int来寻址,更不用说size_t了。 – Dougal 2012-07-29 06:38:53

回答

7

这似乎是fread/fwrite的一般OSX错误,所以不能由Python用户真正解决。请参阅numpy #3858,this torch7 commit,this SO question/answer,...

据说它已在小牛队修复,但我仍然看到这个问题。

Python 2可能已经解决了这个问题,或者它的io模块可能总是缓冲大的读/写;我没有彻底调查过。

-2

也许尝试不用b标志打开,我不认为这是支持所有操作系统/文件系统。

+0

'b'标志对[二进制模式]是必需的(http://docs.python.org/py3k/library/functions.html?highlight=open#open),它意味着在python 3中,它处理字节而不是字符串。你可能想到的是,在Python 2的Unix平台上,'b'是不可操作的,现在不再是这种情况了。 – Dougal 2012-08-29 23:37:22

+0

此外,为了确保,我只是试了一下(用'w'打开文件并执行'f.write(the_bytestring.decode('latin1'))'来输出基于真正字节串的乱码;得到了相同的IOError 22。 – Dougal 2012-08-30 00:09:02