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,另一个这样的大数据框架。
虽然这只是一次性任务,但启动这些框架之一可能不值得。
我需要在内存中保存一个非常大的向量,大小约为 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,另一个这样的大数据框架。
虽然这只是一次性任务,但启动这些框架之一可能不值得。