我需要在内存中保存一个非常大的向量,大小大约为 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?或者也许有更好的选择?
谢谢
请您参考如下方法:
简单的解决方案
听起来您使用的是 32 位版本的 Python(我还假设您在 Windows 上运行)。来自numpy.memmap文档:
Memory-mapped files cannot be larger than 2GB on 32-bit systems.
因此,解决您的问题的简单方法是将您的 Python 安装升级到 64 位。
如果您的 CPU 是在过去十年的某个时候制造的,那么应该可以升级到 64 位 Python。
备选方案
只要您的 Python 是 32 位的,处理大于 2 GB 的数组就永远不会简单或直接。您唯一真正的选择是在您最初创建阵列/将其写入磁盘时将阵列分成不大于 2 GB 的部分。然后,您将独立地对每个部分进行操作。
此外,您仍然必须对每个部分使用 numpy.memmap,否则 Python 本身会耗尽内存。
重型替代品
如果处理这类大型数组是您必须经常做的事情,您应该考虑将您的代码/工作流切换到其中一个大数据框架。现在有一大堆可用于 Python 的工具。我用过 Pyspark之前广泛使用,而且它非常易于使用(尽管需要大量设置)。在评论中 B. M. 提到 Dask ,另一个这样的大数据框架。
虽然这只是一次性任务,但启动这些框架之一可能不值得。
