2012-12-06 34 views
3

我有几个〜50 GB的文本文件,我需要解析特定内容。我的文件内容以4行块组织。为了执行这种分析,我使用file.read(chunk_size)在文件的小节中读取并拆分为4个块,然后分析它们。file.read()中的错误在64位python上返回2 GB以上

因为我经常运行这个脚本,我一直在优化并尝试改变块大小。我在OSX Lion上运行64位2.7.1 python,并在16 GB RAM的计算机上运行,​​我注意到当我加载块大于等于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' 

到底是怎么回事呢?

+0

这可能允许在CPython实现中打开错误报告。现在我的手上没有那么多RAM,所以我不能复制。 – Afiefh

+1

我不是Python英雄,但它听起来像chunk_size参数的类型是32位int,它将在2 ** 31处包装为负数。此外,Python似乎没有办法强制这些值无符号。 ---但是它支付使用这么大的块大小吗?我在C++中的测试表明,使用大于256k的缓冲区时几乎不会加速。 – cxxl

回答

1

是的,这是根据cpython源代码中的评论的已知问题。你可以在Modules/_io/fileio.c中查看它。代码仅在Microsoft Windows 64bit上添加解决方法。

相关问题