目前,我正在用Python为本科论文实施本文,但我只使用Mahalanobis Metric Learning(如果您很好奇)。
在快捷方式中,当我需要学习一个由整数组成的67K*67K的矩阵时,我会面临问题,而简单地通过 numpy.dot(A.T,A)
,其中a是一个随机向量大小(1,67K)。当我这样做时,这只是扔内存器,因为我的PC只有8GB RAM,而所需内存的原始计算是16GB。比我寻找替代方案并找到了dask。
所以我使用此dask.array.dot(A.T,A)
继续前往Dask,并且已经完成了。但是,我需要对矩阵进行美白转换,在DASK中,我可以通过获得SVD来实现它。但是每次我这样做时,ipython内核死亡(由于缺乏记忆,我认为这是因为它认为它)。
这是我远离初始化的事情,直到内核死亡:
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的裸金属服务器。即使我这样做了,还够了吗?
一般来说的dask。array不能保证所有计算的核心外操作。方形矩阵矩阵乘数(或任何L3 BLAS操作)或不可能在小内存中有效地做到。
you can 要求dask使用中间值的盘缓存。请参阅问题下的常见问题我的计算填充内存,我如何溢出到磁盘?。但是,这将受到磁盘编写速度的限制,这些速度通常相当慢。
大型存储器和Numpy可能是解决此问题的最简单方法。另外,您可以尝试找到对问题的不同表述。