我面临一个问题,我需要在两个大矩阵A [400000 x 70000]
和B [70000 x 1000]
之间执行矩阵乘法。这两个矩阵是稠密的,没有我可以利用的特殊结构。在
目前我的实现是将A
分成多个行块,比如,sub_A [2000 x 70000]
和perfrom{sub_A
中读取。读入矩阵大约需要500秒,计算大约需要300秒。在
在这里使用PyTables有助于提高I/O效率吗?有没有图书馆可以帮助提高时间效率?在
代码如下:
def sim_phe_g(geno, betas, chunk_size):
num_indv = geno.row_count
num_snps = geno.col_count
num_settings = betas.shape[1]
phe_g = np.zeros([num_indv, num_settings])
# divide individuals into chunks
for i in range(0, num_indv, chunk_size):
sub_geno = geno[i : i + chunk_size, :]
sub_geno = sub_geno.read().val
phe_g[i : i + chunk_size, :] = np.dot(sub_geno, betas)
return phe_g
geno
大小为[400000 x 70000]
,而{[70000 x 1000]
。geno
这是一个存储在磁盘中的大矩阵。语句sub_geno = sub_geno.read().val
将把基因型的一大块加载到内存中。而且这个声明花费了很多时间。在
另外,由于32GB内存大小的限制,我将大矩阵分成块。在
如果适用,尝试使用tensorflow进行大矩阵乘法,正如您从这个article中看到的,在许多情况下,tensorflow在大矩阵的情况下表现得更好。同样的原因很可能是它主要是为了高效地处理大型矩阵而构建的。在
有关矩阵乘法具体用法的详细信息,请参阅documentation。在
我在(10001000)矩阵上测试了它的乘法运算:
对于
numpy.matmul
=60ms±5.35对于
tensorflow.matmul
=42.5 ms±2.47 m平均每人进行100次共享和stdev测试
p.S.Tensorflow的cpu版本仅使用
尝试使用TensowFlow进行GPU优化,这对矩阵乘法非常好,因为它允许您并行化每个操作。在
相关问题 更多 >
编程相关推荐