Python IOError:[Errno 22]读取/写入大bytestring时参数无效

Python IOError:[Errno 22]读取/写入大bytestring时参数无效,python,macos,python-3.x,Python,Macos,Python 3.x,我要走了 IOError: [Errno 22] Invalid argument 当我尝试使用f.write()将大型bytestring写入磁盘时,其中f是以wb模式打开的 我在网上看到很多人在使用Windows网络驱动器时遇到这个错误,但我现在使用的是OSX(我最初问这个问题时是10.7,但现在是10.8,使用标准的HFS+本地文件系统)。我使用的是Python3.2.2(在Python.org二进制文件和自制软件上都有)。我认为Python2.7.2系统没有这个问题 我还尝试了基于的模

我要走了

IOError: [Errno 22] Invalid argument
当我尝试使用
f.write()
将大型bytestring写入磁盘时,其中
f
是以
wb
模式打开的

我在网上看到很多人在使用Windows网络驱动器时遇到这个错误,但我现在使用的是OSX(我最初问这个问题时是10.7,但现在是10.8,使用标准的HFS+本地文件系统)。我使用的是Python3.2.2(在Python.org二进制文件和自制软件上都有)。我认为Python2.7.2系统没有这个问题

我还尝试了基于的模式
w+b
,但当然没有帮助


数据来自一个大的numpy阵列(几乎4GB的浮点)。如果我手动循环字符串并将其分块写出,效果会很好。但是因为我不能一次完成所有的操作,
np.save
np.savez
都失败了——因为它们只使用
f.write(ary.tostring())
。当我试图用
h5py
将其保存到现有的HDF5文件时,会出现类似的错误

请注意,在读取使用
文件(文件名为'rb')
打开的文件时,我遇到了相同的问题:
f.read()
给出了这个
IOError
,而
f.read(chunk\u size)
对于合理的
chunk\u size
有效


有什么想法吗?

也许试着不要用b标志打开,我认为这在所有操作系统/文件系统上都不受支持。

这似乎是一个带有fread/fwrite的通用OSX错误,因此Python用户无法真正修复。看

据说小牛队已经解决了这个问题,但我仍然看到了这个问题


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

奇怪<代码>EINVAL=22,但中的任何内容都不适用。你能在下面运行以检查是否真的是
write
syscall失败了吗?“如果我手动循环字符串并将其分块写出来,效果很好。”那么你为什么不这样做呢?您认为一次应该能够写入多大的数据块?用
size\u t
?正如我所说的@msw,这打破了
np.save
,对我来说更重要的是
h5py
。显然,如果我是手动操作的,我可以并且确实可以分块编写,如果我先创建数据集,然后一次编写50行,那么它在
h5py
中工作。但这不应该是必要的,这两个库都不认为有必要这样做。我的数组“只有”5亿个条目(log_2<29),可以通过32位
int
寻址,更不用说
size\u t
@ephemient了,谢谢你的建议。我放置了一个测试脚本及其dtruss输出(在脚本处于“生成输出”状态时附加)。错误“在DIF偏移量44处超出了作用空间#12”似乎很可疑,但我不能100%确定如何解释这一错误。我的桌面上有8GB的ram,在生成过程中,至少大部分内存是满的,但不是完全满的——这似乎意味着在写操作过程中有什么东西试图创建一个完整的拷贝?请注意,输出文件已创建,但为空。该错误看起来像是
dtruss
失败——它没有截断长字符串(如
strace
),而是无法缓冲系统调用信息:(尽管如此,
write
系统调用显然是值得的。我想知道
0x601
标志
open
是什么意思;
1
通常是
O_WRONLY
,但我无法在没有OSX头的情况下查找
0x200
0x400
。如果其中一个是
O_DIRECT
,那么这是导致写入失败的一个潜在原因,但IIRC该标志在OS X上不存在…仍然令人困惑。
b
标志对于是必需的,这意味着在python 3中它处理字节而不是字符串。您可能想的是,
b
在python 2的Unix平台上是一个禁止操作的标志,现在不再是这样了。另外,请注意请确保,我只是尝试了(使用模式
w
打开文件并执行
f.write(the_bytestring.decode('latin1'))
以基于true bytestring输出乱码;得到了相同的IOError 22。