【问题标题】:How to use all available memory如何使用所有可用内存
【发布时间】:2017-01-30 08:45:55
【问题描述】:

我想在安全的情况下加载尽可能多的数据,以便当前进程和其他进程一样正常工作。我宁愿只使用 RAM(不使用交换),但欢迎提出任何建议。可以丢弃过多的数据。这样做的正确方法是什么?如果我只是等待MemoryException,系统将无法运行(如果使用列表)。

data_storage = []
for data in read_next_data():
  data_storage.append(data)

数据最终被加载到numpy数组中。

【问题讨论】:

  • 假设您使用的是 Linux,您可能可以将其 nice 和 ionice 值设置为非常差,并加载您喜欢的任何内容。

标签: python python-3.x numpy memory memory-management


【解决方案1】:

psutil 有一个 virtual_memory 函数,除其他函数外,它还包含一个表示空闲内存的属性:

>>> psutil.virtual_memory()
svmem(total=4170924032, available=1743937536, percent=58.2, used=2426986496, free=1743937536)

>>> psutil.virtual_memory().free
1743937536

这应该是相当准确的(但函数调用代价高昂 - 缓慢 - 至少在 Windows 上)。 MemoryError 不考虑其他进程使用的内存,因此仅当数组的内存超过总可用(可用或不可用)RAM 时才会引发它。

您可能不得不猜测何时停止累积,因为空闲内存可能会发生变化(其他进程有时也需要一些额外的内存)并且转换为 numpy.array 可能会暂时使您使用的内存增加一倍,因为那时列表和数组必须适合您的 RAM。


但是你也可以用不同的方式来解决这个问题:

  • 读入first数据集:read_next_data()
  • 计算此时的空闲内存:psutil.virtual_memory().free
  • 使用第一个数据集的shapedtype 计算可以轻松放入RAM 的数组的形状。假设它使用了factor(即 75%)的可用空闲内存:rows= freeMemory * factor / (firstDataShape * memoryPerElement),这应该会为您提供一次读取的数据集数量。
  • 创建该形状的数组:arr = np.empty((rows, *firstShape), dtype=firstDtype)
  • 加载下一个数据集,但将它们直接存储到您的数组arr[i] = next(read_next_data)。这样一来,您就不会保留这些列表,并且避免了双倍的内存。

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 2020-11-14
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多