在一些情況下,程序運行產生如下結果,然后進程自動終止,導致這一結果的原因很有可能是內存爆炸。
當兩個較大的 (e.g., 10000*10000 維)ndarray 做運算(加法,or 乘法)時,很容易出現這樣的結果.
linux 系統下,使用 top 命令,可以很容易地看到內存(%MEM) 的使用情況:
解決辦法:
- 大多數情況下,這種大矩陣都是稀疏的。盡可能地利用稀疏計算的方式,例如稀疏矩陣,或者只計算非 0 位置的值。
- 如果都是整數運算,可以設置 dtype=int,而非 dtype=float, 可以省下不少空間。
例如:如下代碼段2 可以完成代碼段1 的功能,且避免了大量內存的開銷,同時加快了運行速度。
# 代碼段 1,true_similarity_matrix 是 int, similarity_matrix 是 float
tmp_matrix = similarity_matrix * true_similarity_matrix # 內存會炸掉,兩個 10000*10000 維 float array
num_correct_edge = sum(sum(tmp_matrix))
# 代碼段 2
for i in range():
for j in range():
set_true_ij.append(i,j)
num_correct_edge = 0
for i, j in set_true_ij:
num_correct_edge += similarity_matrix[i,j]