我遇到一个问题,需要在两个大矩阵B [70000 x 1000]
和A
之间执行矩阵乘法。这两个矩阵很稠密,没有可用的特殊结构。
当前,我的实现是将sub_A [2000 x 70000]
分成多行,例如sub_A * B
和每行sub_A
。我注意到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
中进行读取。读取矩阵大约需要500秒,计算大约需要300秒。
在这里使用PyTables对提高I / O效率有用吗?是否有任何有助于提高时间效率的库?
代码如下:
geno
[400000 x 70000]
的大小为betas
,而[70000 x 1000]
的大小为geno
。 sub_geno = sub_geno.read().val
是存储在磁盘中的大型矩阵。语句if(num % w == 0)
将基因型的一部分加载到内存中。这条语句要花费很多时间。
此外,由于32GB的内存大小限制,我将大矩阵分为多个块。
答案 0 :(得分:-1)
如果适用,请尝试将tensorflow用于大型矩阵乘法,正如您从article所看到的,在许多情况下,对于大型矩阵,tensorflow的性能要好得多。出现这种情况的原因很可能是它主要是为了有效处理大型矩阵的目的而构建的。
有关矩阵乘法的具体用法的更多详细信息,请参见documentation。
我在(1000,1000)矩阵上对其进行了乘法测试:
numpy.matmul
= 60毫秒±5.35
tensorflow.matmul
= 42.5 ms±2.47 m
100次跑步,共享均值和标准差
P.S。仅使用了Tensorflow的CPU版本
答案 1 :(得分:-1)
尝试使用TensowFlow进行GPU优化,这对于矩阵乘法非常有用,因为它将允许您并行化每个操作。