numpy数组中的内存管理,python

2024-03-28 11:38:52 发布

您现在位置:Python中文网/ 问答频道 /正文

处理非常大(大于50Gb)的文件时出现内存错误(问题:RAM内存已满)。在

我的解决方案是:我只想一次读取500千字节的数据并进行处理(然后从内存中删除它,然后转到下一个500KB)。还有其他更好的解决办法吗?或者,如果这个解决方案看起来更好,那么如何使用numpy array?在

只是代码的四分之一(只是为了一个想法)

  import h5py
  import numpy as np
  import sys
  import time
  import os
  hdf5_file_name = r"test.h5"
  dataset_name = 'IMG_Data_2'

  file = h5py.File(hdf5_file_name,'r+')
  dataset = file[dataset_name]
  data = dataset.value
  dec_array = data.flatten() 
  ........

我得到内存错误在这一点,因为它试图把所有的数据放入内存。在


Tags: 文件数据内存nameimportnumpydata错误
2条回答

快速回答

更长的答案

一个关键问题是您有多少RAM(10GB,>10GB)以及您正在进行什么样的处理(需要查看数据集中的每个元素一次,或者需要一次查看整个数据集)。在

如果它是<;10GB并且需要查看一次,那么您的方法似乎是最合适的方法。这是处理大于主存的数据集的标准方法。我要做的是将一个块的大小从500kb增加到更接近你的内存量-也许是物理RAM的一半,但无论如何,在GB范围内,但不足以导致交换到磁盘和干扰你的算法。一个很好的优化方法是同时在内存中保存两个块。一个正在处理,另一个从磁盘并行加载。这是因为从磁盘加载数据相对比较昂贵,但不需要太多CPU工作—CPU基本上是在等待数据加载。在Python中很难做到,因为GIL,但是numpy和朋友们不应该受到影响,因为他们在数学运算期间发布GIL。threading包在这里可能很有用。在

如果RAM较低,需要同时查看整个数据集(可能在计算一些二次时间ML算法时,甚至在数据集中执行随机访问时),事情会变得更复杂,而且您可能无法使用前面的方法。要么将算法升级为线性算法,要么需要实现一些逻辑,使numpy等中的算法直接处理磁盘上的数据,而不是将其存储在RAM中。在

如果您有大于10GB的RAM,您可能会让操作系统为您完成这项艰巨的工作,并将交换大小增加到足以捕获所有数据集。通过这种方式,所有的东西都被加载到虚拟内存中,但是只有一个子集被加载到物理内存中,操作系统处理它们之间的转换,所以所有东西看起来就像一个巨大的RAM块。但是如何增加它是操作系统特有的。在

memmap对象可以在任何接受ndarray的地方使用。给定一个memmap fp,isinstance(fp,努比·恩达雷)返回True。在

在32位系统上,内存映射文件不能大于2GB。在

当memmap导致在文件系统中创建或扩展的文件超出其当前大小时,新部分的内容未指定。在具有POSIX文件系统语义的系统上,扩展部分将填充零字节。在

相关问题 更多 >