【发布时间】:2023-03-05 16:44:01
【问题描述】:
我正在尝试使用犰狳进行线性回归,如下面的函数:
void compute_weights()
{
printf("transpose\n");
const mat &xt(X.t());
printf("inverse\n");
mat xd;
printf("mul\n");
xd = (xt * X);
printf("inv\n");
xd = xd.i();
printf("mul2\n");
xd = xd * xt;
printf("mul3\n");
W = xd * Y;
}
我已将其拆分,以便了解程序变得如此庞大时发生了什么。矩阵 X 有 64 列和超过 2300 万行。转置还不错,但是第一次乘法会导致内存占用完全爆炸。现在,据我了解,如果乘以 X.t() * X,矩阵乘积的每个元素将是 X 的列和 X.t() 的行的点积,结果应该是 64x64 矩阵。
当然,这应该需要很长时间,但是为什么内存会突然爆炸到近 30 GB 呢?
然后它似乎挂在那个内存上,然后当它到达第二个乘法时,它太多了,操作系统因为它变得如此巨大而杀死它。
有没有一种方法可以在没有太多内存使用的情况下计算产品?那段记忆能恢复吗?有没有更好的方法来表示这些计算?
【问题讨论】:
-
您的
X矩阵已经占用了 11 Gb。矩阵xt占用另外 11 Gb。表达式(xt * X)可以在内部为xt的每一行使用一个缓存,它使用大约200 Mb。这已经超过 22 Gb,我们还没有开始计算其他对象(如矩阵Y)或其他地方的开销(操作系统、其他正在运行的程序等) -
你想在内存中处理巨大的矩阵,所以它需要大量的内存。如果你把它分成几块,那将需要很多时间。在几乎没有额外内存的情况下一次性完成所有操作的唯一方法是使用魔杖。
标签: c++ matrix out-of-memory armadillo