连接或vstack numpy数组加倍内存

时间:2018-01-26 09:43:35

标签: python arrays numpy memory-management

以前的一些信息

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

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)

1 个答案:

答案 0 :(得分:0)

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