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或其他?)对巨大矩阵进行快速下采样

numpy.memmap 映射保存文件

将 CSV 文件加载到 NumPy memmap 数组使用太多内存

无法在 Matlab 中保存非常大的矩阵

XCode 4 无法编译一个非常大的数组,以及关于 NSArray/NSString 开销的问题

如何在 C# 中解析非常大的 XML 文件? [复制]