numpy.memmap 无法处理非常大的数据

numpy.memmap not able to handle very big data

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

有没有办法克服这个问题并使用memmap?或者也许有更好的选择?

谢谢

简单的解决方案

听起来您使用的是 Python 的 32 位版本(我还假设您在 Windows 上 运行ning)。来自 numpy.memmap 文档:

Memory-mapped files cannot be larger than 2GB on 32-bit systems.

因此,解决您的问题的简单方法是将 Python 安装升级到 64 位。

如果您的 CPU 是在过去十年的某个时候制造的,应该可以升级到 64 位 Python。

备选方案

只要您的 Python 是 32 位的,使用大于 2 GB 的数组就永远不会简单或直接。您唯一真正的选择是在您最初创建 it/write 到磁盘时将阵列分成不超过 2 GB 的部分。然后,您将独立地对每个部分进行操作。

此外,您仍然必须对每个部分使用 numpy.memmap,因为 Python 本身将 运行 内存不足。

重型替代品

如果处理这类大型数组是您必须经常做的事情,您应该考虑将 code/workflow 切换到其中一个大数据框架。 Python 现在有一大堆可供使用。我用过Pyspark extensively before, and it's pretty easy to use (though requires a bunch of set up). In the comments B. M. mentions Dask,另一个这样的大数据框架。

虽然这只是一次性任务,但启动这些框架之一可能不值得。