Python numpy.memmap无法处理非常大的数据
我需要在内存中保存一个非常大的向量,大约10*8大小,我需要快速随机访问它。 我尝试使用numpy.memmap,但遇到以下错误:Python numpy.memmap无法处理非常大的数据,python,python-3.x,numpy,out-of-memory,bigdata,Python,Python 3.x,Numpy,Out Of Memory,Bigdata,我需要在内存中保存一个非常大的向量,大约10*8大小,我需要快速随机访问它。 我尝试使用numpy.memmap,但遇到以下错误: RuntimeWarning: overflow encountered in int_scalars bytes = long(offset + size*_dbytes) fid.seek(bytes - 1, 0): [Errno 22] Invalid argument 似乎memmap使用了一个长的向量,而我的向量长度太大了 有没有办法克服这个问题并使
RuntimeWarning: overflow encountered in int_scalars bytes = long(offset + size*_dbytes)
fid.seek(bytes - 1, 0): [Errno 22] Invalid argument
似乎memmap使用了一个长的向量,而我的向量长度太大了
有没有办法克服这个问题并使用memmap?或者有一个好的选择
谢谢简单的解决方案
听起来您使用的是32位版本的Python(我还假设您运行的是Windows)。从文档中:
32位系统上的内存映射文件不能大于2GB
因此,解决问题的简单方法是将Python安装升级到64位
如果您的CPU是在过去十年的某个时候制造的,那么应该可以升级到64位Python
选择
只要您的Python是32位的,使用大于2GB的阵列就永远不会简单或直接。您唯一的实际选择是在最初创建阵列/将其写入磁盘时将其拆分为不大于2 GB的部分。然后,您将独立地对每个部件进行操作
此外,您还必须对每个片段使用numpy.memmap
,否则Python本身将耗尽内存
重型替代品
如果处理这些大数组是必须经常做的事情,你应该考虑把代码/工作流转换到一个大数据框架上。Python现在有一大堆可用的工具。我以前已经广泛使用过,而且它非常容易使用(尽管需要很多设置)。B.M.在评论中提到了另一个这样的大数据框架
尽管这只是一项一次性任务,但可能不值得费心去构建这些框架中的一个。。您的描述中有些地方没有意义。有符号的
long
至少有32个字节,它可以存储的最大数字略大于2*10**9
。如果数组的大小在10**8
的顺序上,应该不会有问题。10**8*4的确切大小和我在每个单元格中使用的float64,因此它的总和大于长10**9。@B.M.感谢您的建议,我检查了Dask数组,但它们似乎是不可变的,因此不适合我的用途,Dask是否提供了一种可变的数组?