使用 np.fromfile 时文件大小的最大限制是多少?

3

np.fromfile()是否有最大文件大小限制?我试图读取一个48GB的文件,其中包含约2.1e9条记录(每个记录有5个值)。

当我将计数限制为8e7时,它可以正常工作:

fromfile(filename, dtp, int(8e7))
Out[69]: 
array([(1, 244025.0, 1.1666666269302368, 360.1666564941406, 50.0),
       (2, 244025.0, 1.1666666269302368, 360.5, 50.0),
       (3, 244025.0, 1.1666666269302368, 360.8333435058594, 50.0), ...,
       (255138, 244131.0, 1128.9346923828125, 461.38494873046875, 49.5),
       (255139, 244131.0, 1143.77783203125, 473.2532958984375, 49.5),
       (255140, 244131.0, 1150.4803466796875, 464.6799011230469, 49.5)], 
      dtype=[('ntrac', '<i4'), ('ints', '<f8'), ('x', '<f4'), ('y', '<f4'), ('z', '<f4')]) 

但是,当计数设置为9e7时,所有的值都被读取为零:

In [70]: fromfile(filename, dtp, int(9e7))
Out[70]: 
array([(0, 0.0, 0.0, 0.0, 0.0), (0, 0.0, 0.0, 0.0, 0.0),
       (0, 0.0, 0.0, 0.0, 0.0), ..., (0, 0.0, 0.0, 0.0, 0.0),
       (0, 0.0, 0.0, 0.0, 0.0), (0, 0.0, 0.0, 0.0, 0.0)], 
      dtype=[('ntrac', '<i4'), ('ints', '<f8'), ('x', '<f4'), ('y', '<f4'), ('z', '<f4')])

32位还是64位的Python? - Fred Foo
通过macports安装在Mac OS X上的64位。 - brorfred
知道自己之前写代码时我实际上检查过了!sys.maxsize: 9223372036854775807; sys.maxsize > 2**32: True - brorfred
是的,我怀疑它对你有所帮助,我真的不明白这是如何可能的,这里发生的一切都只是对fread的调用,而在那个调用之前的类型必须基本正确,否则你会得到错误。 - seberg
这似乎与程序有关(OSX bug):https://github.com/numpy/numpy/issues/574 那个 bug 和解决方法是针对文件写入的,但是可能在读取方面,OSX 也存在类似的 bug。 - pv.
显示剩余2条评论
2个回答

2
可能是Mac OSX fread()例程中的一个错误。 fwrite()例程确实存在类似的错误:https://github.com/numpy/numpy/issues/574
您可以通过编写简单的C测试程序(例如该票据附带的程序),然后向Apple投诉来检查此问题。
解决方法是以足够小的块读取文件。
编辑:快速阅读了错误报告 --- fwrite()错误不完全相似,但我认为不能排除操作系统错误...

2

太好了,谢谢!是的,看起来非常大的文件被操作系统破坏了。我开始想知道这是否也会影响其他文件类型。我从scipy写大型.mat和netcdf文件时也遇到了巨大的问题。 - brorfred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接