【发布时间】:2016-03-03 07:23:20
【问题描述】:
代码太复杂,无法在此处粘贴,但我有一个形状为 (800, 800, 1300) 的 numpy 数组,或形状为 (800, 800) 的 1300 个矩阵。这是 5GB。
我将这个数组传递给一个函数,由此函数
将上述数组中的每个“矩阵”乘以
(1300,)形状数组中的浮点数将数组求和成一个“矩阵”,形状为
(800, 800)取矩阵的逆
此程序在 20.2 GB RAM 上运行!那可能吗?我看不到任何内存泄漏。我只是采用 numpy 数组,并将它们传递给一个函数。然后我保存生成的数组。
我会尝试发布代码。
import math
import matplotlib.pyplot as plt
import numpy as np
import scipy
import scipy.io
import os
data_file1 = "filename1.npy"
data_file2 = "filename2.npy"
data_file3 = "filename3.npy"
data1 = np.load(data_file1)
data2 = np.load(data_file2)
data3 = np.load(data_file3)
data_total = np.concatenate((data1, data2, data3)) # This array is shape (800,800,1300), around 6 GB.
array1 = np.arange(1300) + 1
vector = np.arange(800) + 1
def function_matrix(data_total, vector):
Multi_matrix = array1[:, None, None] * data_total # step 1, multiplies each (800,800) matrix
Sum_matrix = np.sum(Multi_matrix, axis=0) #sum matrix
mTCm = np.array([np.dot(vector.T , (np.linalg.solve(Sum_matrix , vector)) )])
return mTCm
draw_pointsA = np.asarray([[function_matrix(data_total[i], vector[j]) for i in np.arange(0,100)] for j in np.arange(0,100)])
filename = "save_datapoints.npy"
np.save(filename, draw_pointsA)
编辑 2:
见下文。它实际上是 12 GB RAM,20.1 GB 虚拟进程大小。
【问题讨论】:
-
请出示您的代码。
-
我们无法调试我们看不到的东西。但是您确定它是 20.2 GB 的 RAM 吗?您能否准确解释一下您是如何获得该测量值的?
-
这三个步骤中哪一个导致内存使用量大?
-
800 * 800 * 1300 * 8(每个浮点数的字节数)为 6.7G。 ufuncs 的输出是一个新数组。所以步骤 1 产生了一个新的 6.7G 阵列。您可以使用
out参数来减少这种情况。 -
写。加载时,您可以从一开始就将数据存储在内存映射的二进制文件中; wrt。处理,尝试就地处理,即避免复制矩阵,包括。中间结果。
标签: python arrays python-3.x numpy matrix