【发布时间】:2018-07-22 18:52:08
【问题描述】:
我面临一个问题,我需要在两个大矩阵 A [400000 x 70000] 和 B [70000 x 1000] 之间执行矩阵乘法。这两个矩阵很密集,没有我可以利用的特殊结构。
目前我的实现是将A 划分为多个行块,例如sub_A [2000 x 70000] 和执行sub_A * B。我注意到有很多时间花在 I/O 上,即阅读 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],betas 的大小为 [70000 x 1000]。 geno 这是一个存储在磁盘中的大矩阵。语句sub_geno = sub_geno.read().val 会将基因型的一部分加载到内存中。而且这种说法很费时间。
另外,由于 32GB 内存大小的限制,我将大矩阵分成块。
【问题讨论】:
-
时间对我来说似乎很大。显示您当前的代码,看看是否可以优化。
-
@Daniel 我已附上我当前的代码。
-
假设您有足够的内存,您可以将
geno移动到 RAM 磁盘。这应该会大大减少计算的 I/O 时间。 -
为什么不将矩阵划分为子矩阵(而不是行)以增加所有数据的重用率,这样 comm 就不再是问题了?为什么在达到 100x100 大小之前不采用多个分而治之的关卡?如果这还不够好,请尝试使用 strassen 的乘法,它可以将每个分/治级别的数据减少 1/8。
标签: python numpy matrix-multiplication