【问题标题】:concatenate or vstack numpy arrays doubling memory连接或 vstack numpy 数组加倍内存
【发布时间】:2018-01-26 09:43:35
【问题描述】:

一些以前的信息

我有以下方法,它从磁盘加载两个数据集,然后将它们合并并返回合并后的数据集。

def _get_data(self, data_set_name):
    training_data = DataSet.from_file('path_to_data_file','path_to_label_file')
    test_data = DataSet.from_file('path_to_data_file','path_to_label_file')
    return training_data.concat(test_data) # doubles the memory consumption

DataSet看起来像这样:

class DataSet:
  def __init__(self, data, labels):
    self.x = data # float64 array of shape (x,y)
    self.y = labels # int array of shape (x,)

  def concat(self, other_data_set):
    new_x = numpy.vstack((self.x, other_data_set.x))
    new_y = numpy.concatenate((self.y, other_data_set.y))

    return DataSet(new_x, new_y)

我的问题

当调用DataSet.concat 时,内存会翻倍。这首先是预期的行为,因为 numpy 创建了两个包含组合数据的新数组。 但是离开_get_data 方法后,变量training_datatest_data 不应再引用较小的数据集。 所以我预计内存消耗应该再次减少。 这不会发生。因为想知道,所以我尝试手动调用垃圾收集,但没有成功。

data_set = _get_data('someName')
gc.collect(0)
gc.collect(1)
gc.collect(2)
# Still same memory consumption

谁能向我解释这里发生了什么?我做错了吗?

更新

我通过以下代码测量内存:

pid = os.getpid()
py = psutil.Process(pid)
memoryUse = py.memory_info()[0] / 2. ** 30  # memory use in GB
print('memory use:', memoryUse)

【问题讨论】:

  • 不确定这是否有帮助:尝试运行手动收集 (gc.collect()) 三次,分别传递 0、1 和 2(以释放所有代的对象)。
  • 感谢@kazemakase 的建议。我试过了,但这不会导致内存消耗发生任何变化。
  • 只是一个想法;)顺便说一句,这也可能与您测量内存消耗的方式有关。 也许 Python 没有将内存释放回操作系统,而是在内部将其标记为空闲?
  • 如果是这种情况,那就和我的测量有关,但这与python对其他操作的作用不同。
  • 我尝试分配和del 一个 numpy 数组并立即释放内存(根据 Windows/IPython 上的 Taskmanager)。这使我对内存没有释放回操作系统的猜测无效——至少在我的设置中是这样。这里可能正在发生其他事情。你确定你确实保留了对原始数组的任何引用吗?

标签: python arrays numpy memory-management


【解决方案1】:

看起来这种行为是由于调试而发生的。 当我在_get_data 之前放置断点时,退出_get_data 并继续前进后内存没有被释放。 当我在调用_get_data 后放置第一个断点时,内存被正确释放。 我不知道调试会对内存管理产生如此大的影响。

【讨论】:

  • 所有问题都与调试有关吗?我有一个非常相似的问题,但我根本没有调试。我读取了一堆 .npy 文件,将数组附加到列表中,将列表 vstack 到单个数组中,最终的内存消耗(在失去对数组列表的引用之后)是单个数组应该消耗的内存的两倍.我不知道为什么!
猜你喜欢
  • 2018-12-26
  • 1970-01-01
  • 2014-12-21
  • 2018-09-28
  • 2014-06-15
  • 2021-10-31
  • 2015-01-03
  • 1970-01-01
  • 2017-05-27
相关资源
最近更新 更多