我正在通过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
.我错了吗?为什么我的记忆力如此疯狂?
(非匿名)mmap
是文件和RAM之间的链接,大致可以保证当RAM mmap
已满时,数据将被分页到给定文件而不是交换磁盘/文件,当你msync
或munmap
它时, RAM的整个区域被写入文件.操作系统通常遵循惰性策略.磁盘访问(或急切的RAM):只要数据适合,数据就会保留在内存中.这意味着具有大型mmaps的进程将占用尽可能多的RAM,然后将其余部分溢出到磁盘.
所以你是对的,一个np.memmap
数组是一个核外数组,但它是一个可以尽可能多地获取RAM缓存的数组.