Memory 在64位python上,file.read()返回的值超过2 GB时出错

Memory 在64位python上,file.read()返回的值超过2 GB时出错,memory,python-2.7,large-files,Memory,Python 2.7,Large Files,我有几个~50 GB的文本文件需要解析特定内容。我的文件内容按4个行块组织。要执行此分析,我使用file.read(chunk\u size)读取文件的子部分,并将其分成4个块,然后进行分析 因为我经常运行这个脚本,所以我一直在优化并尝试改变块大小。我在OSX Lion上运行64位2.7.1 python,运行的计算机内存为16 GB,我注意到当我加载大于等于2^31的块时,会重复大量的/x00,而不是预期的文本。这一直持续到我的测试结果,包括2^32,之后我再次得到文本。然而,它似乎只返回与添

我有几个~50 GB的文本文件需要解析特定内容。我的文件内容按4个行块组织。要执行此分析,我使用file.read(chunk\u size)读取文件的子部分,并将其分成4个块,然后进行分析

因为我经常运行这个脚本,所以我一直在优化并尝试改变块大小。我在OSX Lion上运行64位2.7.1 python,运行的计算机内存为16 GB,我注意到当我加载大于等于2^31的块时,会重复大量的/x00,而不是预期的文本。这一直持续到我的测试结果,包括2^32,之后我再次得到文本。然而,它似乎只返回与添加到4GB以上缓冲区的字节数相同的字符数

我的测试代码:

for i in range((2**31)-3, (2**31)+3)+range((2**32)-3, (2**32)+10):
    with open('mybigtextfile.txt', 'rU') as inf:
        print '%s\t%r'%(i, inf.read(i)[0:10])
我的输出:

2147483645  '@HWI-ST550'
2147483646  '@HWI-ST550'
2147483647  '@HWI-ST550'
2147483648  '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2147483649  '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2147483650  '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4294967293  '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4294967294  '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4294967295  '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4294967296  '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4294967297  '@\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4294967298  '@H\x00\x00\x00\x00\x00\x00\x00\x00'
4294967299  '@HW\x00\x00\x00\x00\x00\x00\x00'
4294967300  '@HWI\x00\x00\x00\x00\x00\x00'
4294967301  '@HWI-\x00\x00\x00\x00\x00'
4294967302  '@HWI-S\x00\x00\x00\x00'
4294967303  '@HWI-ST\x00\x00\x00'
4294967304  '@HWI-ST5\x00\x00'
4294967305  '@HWI-ST55\x00'

到底发生了什么?

是的,根据cpython源代码中的评论,这是已知的问题。您可以在Modules/_io/fileio.c中检查它。代码只在Microsoft windows 64位上添加了一个变通方法。

这可能需要在CPython实现中打开错误报告。我现在手头上没有那么多RAM的系统,所以我无法复制。我不是Python英雄,但听起来chunk_size参数的类型是32位int,它将在2**31处换行为负数。此外,Python似乎没有办法强制这些值为无符号但使用如此大的块大小是否值得?在使用大于256K的缓冲区时,我的C++测试几乎没有加速。