file.read()中的错误在64位python上返回2 GB以上

时间:2012-12-06 23:14:11

标签: memory python-2.7 large-files

我需要解析几个~50 GB的文本文件以获取特定内容。我的文件内容以4个行块组织。为了执行此分析,我使用file.read(chunk_size)读取文件的子部分,并将其拆分为4个块,然后对其进行分析。

因为我经常运行这个脚本,所以我一直在优化并尝试改变块大小。我在具有16 GB RAM的计算机上在OSX Lion上运行64位2.7.1 python,我注意到当我加载块> = 2 ^ 31而不是预期的文本时,我会重复大量的/ x00。这种情况一直持续到我的测试一直显示,包括2 ^ 32,之后我再次获得文本。但是,它似乎只返回了多于4 GB的缓冲区中添加的字节数。

我的测试代码:

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'

到底发生了什么?

1 个答案:

答案 0 :(得分:1)

是的,根据cpython源代码中的注释,这是已知问题。您可以在Modules / _io / fileio.c中进行检查。并且代码仅在Microsoft Windows 64bit上添加了一种解决方法。