A(50000, 100) B(100, 50000)
我使用numpy的点方法来乘以两个矩阵。我得到了分段错误。
numpy.dot(A,B)
点积在30000行的矩阵上运行良好,但50000行失败。
答案 0 :(得分:2)
正如您所知,存在内存问题。你想这样做:
numpy.dot(A, A.T)
结果需要大量内存(不是操作数)。然而,操作易于分片执行。您可以使用基于循环的方法一次生成一个输出行:
def trans_multi(A):
rows = A.shape[0]
result = numpy.empty((rows, rows), dtype=A.dtype)
for r in range(rows):
result[r,:] = numpy.dot(A, A[r,:].T)
return result
因此,这只是一个较慢且同样耗费内存的版本(numpy.dot
已经过优化)。但是,您最想要做的是将结果写入文件,因为您没有内存来保存结果:
def trans_multi(A, filename):
with open(filename, "wb") as f:
rows = A.shape[0]
for r in range(rows):
f.write(numpy.dot(A, A[r,:].T).tostring())
是的,它并不是完全闪电般的。但是,它很可能是你能想到的最快的。顺序写入通常是经过优化的。我试过了:
a=numpy.random.random((50000,100)).astype('float32')
trans_multi(a,"/tmp/large.dat")
大约需要60秒,但这实际上取决于您的硬盘性能。
为什么不记忆?
我喜欢mmap
,numpy.memmap
是件好事。但是,numpy.memmap
已针对包含大表并从中计算小结果进行了优化。例如,memmap.dot
针对memmapped数组的点积进行了优化。场景是操作数是memmapped,但结果是在RAM中。完全相反,就是这样。
当您进行随机访问时,Memmapping非常有用。这里的访问不是随机访问,而是顺序写入。此外,如果您尝试使用numpy.memmap
创建一个(50000,50000)float32数组,则需要一些时间(由于某些原因我无法得到,即使没有必要也可能初始化数据)
但是,在创建文件之后,最好使用numpy.memmap
来分析巨大的表,因为它提供了最佳的随机读取性能和非常方便的界面。