目前我正在使用python为我的本科论文实现这个paper,但我只使用mahalanobis度量学习(如果你好奇的话)。
在快捷方式中,当我需要学习由整数组成的67K * 67K大小的矩阵时,我只会遇到问题,只需numpy.dot(A.T,A)
,其中A是随机向量大小(1,67K)。当我这样做时,它只是抛出MemoryError,因为我的PC只有8gb ram,并且所需内存的原始计算是16gb到init。比我搜索替代品并找到dask。
所以我继续用这个dask.array.dot(A.T,A)
来完成任务并完成了。但是我需要对该矩阵进行白化转换,而在dask中我可以通过获取SVD来实现它。但是每次我做那个SVD,ipython内核都会死掉(我假设它是由于内存不足)。
这是我从init到目前为止所做的事情,直到内核死掉:
fv_length=512*2*66
W = da.random.randint(10,20,(fv_length),(1000,1000))
W = da.reshape(W,(1,fv_length))
W_T = W.T
Wt = da.dot(W_T,W); del W,W_T
Wt = da.reshape(Wt,(fv_length*fv_length/2,2))
U,S,Vt = da.linalg.svd(Wt); del Wt
我还没有得到U,S和Vt。
即使我使用dask,我的记忆还不足以做这些事吗? 或者实际上这不是一个规范问题,但我的内存管理不好? 或其他什么?
此时我正在拼命尝试其他更大规格的PC,因此我计划租用一台32gb ram的裸机服务器。即使我这样做,这还够吗?
答案 0 :(得分:0)
一般来说,dask.array不保证所有计算的核外操作。在小内存中有效地执行方阵矩阵乘法(或任何L3 BLAS操作)或多或少是不可能的。
你可以要求Dask使用磁盘缓存作为中间值。请参阅问题我的计算填充内存,如何溢出到磁盘?下的FAQ。然而,这将受到磁盘写入速度的限制,这通常相当慢。
大型内存机和NumPy可能是解决此问题的最简单方法。或者,您可以尝试找到问题的不同表述。