笔记:
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/