numpy.memmap 无法处理非常大的数据
Posted
技术标签:
【中文标题】numpy.memmap 无法处理非常大的数据【英文标题】:numpy.memmap not able to handle very big data 【发布时间】:2019-01-15 18:11:50 【问题描述】:我需要在内存中保存一个非常大的向量,大小约为 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?或者有什么好的选择?
谢谢
【问题讨论】:
dask.org. 关于您的描述的某些内容没有意义。一个有符号的long
至少有32个字节,它可以存储的最大数比2*10**9
略大。如果您的数组大小在10**8
的数量级上,则应该没有问题。
10 ** 8 * 4 的确切大小,我在每个单元格中使用 float64,所以它的总和大于 long 10 ** 9。
@B.M.感谢您的建议,我检查了 Dask 数组,但似乎它们是不可变的,因此不适合我的目的,Dask 是否提供一种可变数组?
【参考方案1】:
简单的解决方案
听起来您使用的是 32 位版本的 Python(我还假设您在 Windows 上运行)。来自numpy.memmap
文档:
在 32 位系统上,内存映射文件不能大于 2GB。
因此,解决问题的简单方法是将 Python 安装升级到 64 位。
如果您的 CPU 是在过去十年的某个时间制造的,那么应该可以升级到 64 位 Python。
替代方案
只要您的 Python 是 32 位的,处理大于 2 GB 的数组就永远不会容易或直接。您唯一真正的选择是在您最初创建阵列/将其写入磁盘时将阵列拆分为不超过 2 GB 的部分。然后,您将独立地对每个部分进行操作。
此外,您仍然必须对每个部分使用 numpy.memmap
,否则 Python 本身会耗尽内存。
重型替代品
如果处理这些类型的大型数组是您必须经常做的很多事情,您应该考虑将您的代码/工作流切换到其中一个大数据框架上。现在有一大堆可用于 Python。我以前广泛使用过Pyspark,它非常易于使用(尽管需要进行大量设置)。在 cmets B. M. 中提到了Dask,另一个这样的大数据框架。
虽然这只是一项一次性任务,但启动其中一个框架可能不值得费心。
【讨论】:
以上是关于numpy.memmap 无法处理非常大的数据的主要内容,如果未能解决你的问题,请参考以下文章
使用python(numpy memmap,pytables或其他?)对巨大矩阵进行快速下采样
将 CSV 文件加载到 NumPy memmap 数组使用太多内存