Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy.memmap无法处理非常大的数据_Python_Python 3.x_Numpy_Out Of Memory_Bigdata - Fatal编程技术网

Python 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使用了一个长的向量,而我的向量长度太大了 有没有办法克服这个问题并使

我需要在内存中保存一个非常大的向量,大约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使用了一个长的向量,而我的向量长度太大了

有没有办法克服这个问题并使用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是否提供了一种可变的数组?