我正在通过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
这些操作会快速消耗我的内存。我认为mem-mapping基本上是一种类似于"out-of-core"的numpy.ndarray
,但我错了吗?为什么我的内存使用量像疯子一样飙升?
scipy.sparse.cs{c,r}_matrix
慢几个数量级。密集矩阵乘法事先不知道零在哪里,并且将循环遍历所有元素。 - Fred Foo