笔记:

Speed is not as important as getting a final result.
However, some speed up over worst case is required as well.

我有一个很大的数组A:
A.shape=(20000,265) # or possibly larger like 50,000 x 265

我需要计算相关系数。
np.corrcoeff # internally casts the results as doubles

我只是借用了他们的代码,并编写了自己的cov/corr而不转换为 double 数,因为我真的只需要32位浮点数,并且我放弃了conj(),因为我的数据始终是真实的。
cov = A.dot(A.T)/n  #where A is an array of 32 bit floats
diag = np.diag(cov)
corr = cov / np.sqrt(np.mutliply.outer(d,d))

我仍然用光了内存,并且使用的是264GB的大型内存计算机

有人告诉我,快速的C库可能正在使用中断程序的例程。
将点积分割成碎片,并对其进行优化,将元素数量填充为2的幂。

我真的不需要计算相关系数矩阵的对称一半。
但是,我没有找到一种在合理的时间内通过python循环“手动”执行此操作的方法。

有谁知道向numpy请求像样的点乘积例程的方法,该例程在内存使用与速度之间取得平衡...?

干杯

更新:

有趣的是,如何写这些问题往往可以帮助我找到一种更好的Google查询语言。

发现了这一点:
http://wiki.scipy.org/PerformanceTips

不确定我是否会遵循它。

TIA

编辑:我很抱歉,因为我的数组确实比我想象的要大得多。
数组大小实际上是151,000 x 265
我的264 GB机器上的内存不足,并且至少有230 GB可用空间。

我对blas dgemm的numpy调用感到惊讶,并对C顺序数组保持谨慎
没有下蹲。

最佳答案

使用intel的mkl编译的Python将在大约30秒内以12GB的内存运行此代码:

>>> A = np.random.rand(50000,265).astype(np.float32)
>>> A.dot(A.T)
array([[ 86.54410553,  64.25226593,  67.24698639, ...,  68.5118103 ,
         64.57299805,  66.69223785],
         ...,
       [ 66.69223785,  62.01016235,  67.35866547, ...,  66.66306305,
         65.75863647,  86.3017807 ]], dtype=float32)

如果您无权访问intel的MKL,请下载python anaconda并安装具有30天试用版或对包含mkl编译器的学者免费的加速包。其他各种C++ BLAS库也应该工作-即使将阵列从C复制到F,它也不应该占用大约30GB以上的内存。

我唯一能想到的是您的安装正在尝试做的事情就是尝试将整个50,000 x 50,000 x 265阵列保存在内存中,这确实很可怕。作为引用,float32 50,000 x 50,000阵列仅10GB,而上述阵列为2.6TB ...

如果它是一个gemm问题,您可以尝试一个大块的gemm公式:
def chunk_gemm(A, B, csize):
    out = np.empty((A.shape[0],B.shape[1]), dtype=A.dtype)
    for i in xrange(0, A.shape[0], csize):
        iend = i+csize
        for j in xrange(0, B.shape[1], csize):
            jend = j+csize
            out[i:iend, j:jend] = np.dot(A[i:iend], B[:,j:jend])
    return out

这样会比较慢,但是希望可以解决您的内存问题。

关于大型数组上的numpy相关系数: np. dot(A,A.T)导致seg错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22180850/

10-11 07:08
查看更多