【问题标题】:My data input is 5 GB of numpy arrays, yet running through a function takes 20 GB. Why?我的数据输入是 5 GB 的 numpy 数组,但运行一个函数需要 20 GB。为什么?
【发布时间】:2016-03-03 07:23:20
【问题描述】:

代码太复杂,无法在此处粘贴,但我有一个形状为 (800, 800, 1300) 的 numpy 数组,或形状为 (800, 800) 的 1300 个矩阵。这是 5GB。

我将这个数组传递给一个函数,由此函数

  1. 将上述数组中的每个“矩阵”乘以 (1300,) 形状数组中的浮点数

  2. 将数组求和成一个“矩阵”,形状为(800, 800)

  3. 取矩阵的逆

此程序在 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


【解决方案1】:

这并没有回答您的问题,而是提出了一种从一开始就避免该问题的方法。

步骤 1 是连续的 - 您一次只需要加载 1 个矩阵。 更改代码以独立处理每个矩阵

通过第 2 步,您的内存需求已降至 800 * 800 * sizeof(datum),即几兆字节,您当然可以负担得起将其保留在内存中。

【讨论】:

  • 到目前为止,这是最好的方法。这样做很尴尬,但可以做到。
【解决方案2】:

听起来这可能是一个类型问题,即您将矩阵中的值转换为不同的类型。也许您将原始矩阵的值存储为 int16 或 single,然后将其与浮点数相乘后,将其存储为 double 值矩阵(这需要 2 倍的内存空间)。

您可以使用 dtype 参数来设置矩阵的值类型。

其他可能的原因可能是正在创建一些额外的矩阵。除非您发布代码,否则这显然是不可能解码的。

内存问题的一个可能解决方案是使用 HDF5 文件,并将矩阵写入磁盘。然后你可以一次加载一个矩阵。使用 h5py 很容易,因为可以使用 numpy/scipy 语法压缩和/或切片矩阵。

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2018-02-01
    • 2022-01-02
    • 1970-01-01
    • 2021-08-21
    • 2013-02-27
    • 2017-09-11
    • 2015-08-23
    • 2014-07-20
    相关资源
    最近更新 更多