【问题标题】:Python + Ever-increasing memory allocationPython + 不断增加的内存分配
【发布时间】:2016-01-09 23:03:18
【问题描述】:

我正在编写一个模块来在大型数据集上训练 ML 模型 - 它包括 0.6M 数据点,每个数据点为 0.15M 维度。我在加载数据集本身时遇到问题。 (它的所有 numpy 数组)

下面是一个代码 sn-p(这复制了实际代码的主要行为):

import numpy
import psutil

FV_length = 150000
X_List = []
Y_List = []

for i in range(0,600000):
    feature_vector = numpy.zeros((FV_length),dtype=numpy.int)
    # using db data, mark the features to activated 
    class_label = 0
    X_List.append(feature_vector)
    Y_List.append(class_label)

    if (i%100 == 0):
        print(i)
        print("Virtual mem %s" %(psutil.virtual_memory().percent))
        print("CPU usage %s" %psutil.cpu_percent())

X_Data = np.asarray(X_List)
Y_Data = np.asarray(Y_List)

代码导致内存分配不断增加,直到它被杀死。有没有办法减少不断增加的内存分配

我尝试过使用 gc.collect() 但它总是返回 0。我明确地设置了 variables = None,不再使用。

【问题讨论】:

  • 您期望什么行为?每次绕过循环并将其存储在列表中时,您都会创建一个长度为 FV_length 的新向量。这将导致内存分配增加。您期望在循环结束时分配的总内存是多少?
  • @Conor :我正在使用 PyBrain 训练神经网络。我的特征向量是 0.15 M 维度。我知道我正在创建新向量并将它们迭代地添加到列表中,因此增加了内存分配。我在 AWS 8GB 机器上运行此代码。我想了解有没有更好的方法来编写这段代码?
  • 您试图同时在内存中存储 900 亿个整数。显然,这不适合 8GB 的​​内存。我不知道您在这里期望什么样的答案,因为我们对您的要求一无所知。
  • FV_length 的 150000 和 600000 次迭代,您的最终列表将包含 90000000000 个元素。假设您使用的是 64 位 Python,每个 np.int 元素将是 8 个字节,因此您需要 720000000000 字节或 720GB 才能将元素存储在最终列表中。
  • @Conor, interjay, ali_m:我同意你的推理,但有趣的是,我的 mac (4GB) 上的相同代码运行良好(缓慢但从不中断)。这就是有线部分。

标签: python numpy memory-leaks out-of-memory


【解决方案1】:

正如 cmets 中所指出的,这里的数据量非常大,即使您设法加载了训练集,神经网络也可能会遇到困难。对您来说最好的选择可能是研究数据点的某种降维方法。诸如主成分分析之类的东西可以帮助将 150K 维度降低到更合理的数字。

【讨论】:

  • 如果神经网络在训练期间使用批处理和适当的格式 (lmdb),它可以正常工作。
【解决方案2】:

这是我为类似问题所做的。当它应该被覆盖时,我总是再次创建空列表。

#initialize

X_List = [] 
Y_List = []


//do something with the list

现在,如果您不需要旧值,只需再次创建列表

X_List = [] 
Y_List = []

但我不知道您的情况是否需要或可能。也许这是最惯用的方式,但它确实有效。

【讨论】:

  • 也许它没有回答问题?
猜你喜欢
  • 2014-11-13
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2023-03-09
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多