Python zsh:在大尺寸矩阵计算过程中被杀死



我的情况是我有一个大尺寸的矩阵aa的大小为 2708*2708,类型为<类>。我想使用a计算一些更新方程。

计算过程是这样的:

adj = (a.dot(a.T) + a.T.dot(a)) / LA.norm(a.dot(a.T) + a.T.dot(a))
for k in range(1, 10):
adj = (a.dot(adj).dot(a.T) +a.T.dot(adj).dot(a)) / (LA.norm(a.dot(adj).dot(a.T) + a.T.dot(eadj).dot(a)))

但这给了我

ZSH:被杀

我猜矩阵的大小导致这种情况,但我如何防止这种情况?

有没有办法在不出错的情况下完成此计算killed

您正在尝试使用比您看起来需要的内存多 1000 倍的内存。您不需要将整个列表保留zk,因为您从不使用除zk[k-1]之外的任何值。只需保留对计算的最后一个值的引用,并在每次迭代时将其替换为下一个值。

不要在循环中放置条件来专门处理第一次迭代;只需将其作为预循环计算即可。

b = (a.dot(a.T) + a.T.dot(a)) / LA.norm((a.dot(a.T) + a.T.dot(a)))
for _ in range(1, 1000):  # One fewer iteration

b = ((a.dot(b).dot(a.T) + a.T.dot(b).dot(a))
/ LA.norm((a.dot(b).dot(a.T) + a.T.dot(b).dot(a))))
print(b)

你似乎也做了不必要的工作;每一步使用相同的值作为分子和分母的参数,但你计算了两次。

tmp1 = a.dot(a.T) + a.T.dot(a)
b = tmp1 / LA.norm(tmp1)
for _ in range(1, 1000):
tmp1 = a.dot(b).dot(a.T) + a.T.dot(b).dot(a)
b = tmp1 / LA.norm(tmp1)
print(b)

对于发布的代码,我在系统上得到一个输出。我正在使用 zsh shell 和 python 3.6。我假设您正在使用numpy因为问题中没有提到相同的内容。

可能存在其他问题,而不是您的代码。通常,如果进程内存不足,则会killed该进程。您可以使用top在另一个终端中跟踪代码的内存。或者,您可以先尝试使用较小大小的矩阵进行调试。

最新更新