写入NumPy memmap仍然会加载到RAM内存中

时间:2013-12-20 22:39:49

标签: python python-2.7 numpy

我正在通过IPython Notebook测试NumPy的memmap,代码如下

Ymap = np.memmap('Y.dat', dtype='float32', mode='w+', shape=(5e6, 4e4))

如您所见,Ymap的形状非常大。我试图像稀疏矩阵一样填充Ymap。我没有使用scipy.sparse矩阵,因为我最终需要用另一个密集矩阵对它进行点积,这绝对不适合内存。

无论如何,我正在执行一系列很长的索引操作:

Ymap = np.memmap('Y.dat', dtype='float32', mode='w+', shape=(5e6, 4e4))
with open("somefile.txt", 'rb') as somefile:
    for i in xrange(5e6):
        # Read a line
        line = somefile.readline()
        # For each token in the line, lookup its j value
        # Assign the value 1.0 to Ymap[i,j]
        for token in line.split():
            j = some_dictionary[token]
            Ymap[i,j] = 1.0

这些操作不知何故很快耗尽了我的RAM。我认为mem-mapping基本上是一个非核心的numpy.ndarray。我错了吗?为什么我的记忆力会像疯了一样飙升?

2 个答案:

答案 0 :(得分:13)

(非匿名)mmap是文件和RAM之间的链接,大致可以保证当mmap的RAM已满时,数据将被分页到给定文件而不是交换磁盘/文件,当你msyncmunmap时,RAM的整个区域都被写入文件。操作系统通常遵循惰性策略。磁盘访问(或急切的RAM):只要数据适合,数据就会保留在内存中。这意味着具有大型mmaps的进程会在将其余部分溢出到磁盘之前占用尽可能多的RAM。

所以你是对的,np.memmap数组是一个核心外的数组,但是它会尽可能多地获取RAM缓存。

答案 1 :(得分:4)

作为the docs say

  

内存映射文件用于访问磁盘上的大段文件,而无需将整个文件读入内存。

计算机中没有真正的魔力;-)如果你访问的巨型阵列非常少,那么memmap噱头将需要非常少的内存;如果你访问一个巨大的数组,memmap gimmick将需要非常多的RAM。

在您的特定代码中可能有用或可能没有帮助的一种解决方法:在工作流中的逻辑点定期创建新的mmap对象(并删除旧的mmap对象)。然后,所需的RAM量应与您在这些步骤之间触摸的数组项的数量大致成比例。相反,创建和销毁新的mmap对象需要时间。所以这是一种平衡行为。