【发布时间】:2014-01-09 20:57:09
【问题描述】:
我正在通过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。我弄错了吗?为什么我的内存使用量疯狂飙升?
【问题讨论】:
-
如果内存可用,您为什么希望它不使用内存?那样会慢几个数量级,如果你没有将内存用于其他任何事情,那么你不会从这个成本中获得任何好处。在极少数情况下,您对内存需求的了解比操作系统猜测的多(例如,您有一大块很久没碰过的东西,但即将连续扫描 N 次),您可能需要手动
madvise/mprotect或 Win32 等效项,否则,您根本不必担心。快速耗尽内存是正确的做法,所以要开心。 -
看看pytables,这里可能是个好工具
-
我认为 PyTables 不支持点积,这就是我研究 memmap 的原因。
-
pytables 不支持计算具有快速便利功能的巨大矩阵的点积。但是手动实现点积算法应该是相当简单的。
-
@richizy:mmap 数组非常稀疏的点积可能比
scipy.sparse.cs{c,r}_matrix慢几个数量级。密集矩阵乘法不会先验地知道零点在哪里,并且会遍历所有元素。
标签: python python-2.7 numpy