【问题标题】:Unable to allocate Numpy in Python无法在 Python 中分配 Numpy
【发布时间】:2020-01-14 08:52:49
【问题描述】:

我正在使用包含迭代器/块功能的 read_csv() pandas 函数读取 15Gb .csv 文件,因为我需要大约 20% 的文件子集。

我在 PyCharm 中执行此操作,我将最大堆大小设置为 18Gb(尽管我有 16Gb RAM)并将最小分配内存设置为最大堆大小 9Gb 的一半。在整个过程中,Pycharm 表明我正在使用大约 100Mb 到 200Mb 的 RAM,而 Windows 任务管理器表明我正在使用大约 2.5Gb 的 RAM,其中包括 PyCharm 和 Python 进程。我在任务管理器中剩下大约 45% 的内存。

据我所知,没有任何迹象表明我的内存不足。仍然在读取此数据时,我收到一个内存错误,告诉我:

MemoryError: Unable to allocate array with shape (4, 8193780) and data type float64

有人可以为我澄清这一点吗?我怀疑最终的数据帧可能比我的 RAM 可以处理的大吗?那将是:

( 4 * 8193780 * 8 (float64) ) / (1024**3) < 1Gb

所以上述似乎也不是问题,还是我在这里遗漏了什么?

【问题讨论】:

  • 如果你有 16GB 的内存,我敢肯定它的很大一部分已经被其他应用程序使用了。使用 pandas 将 15GB 的平面文件读入内存将需要额外的内存。例如尝试猜测数据类型等。最重要的是,一旦读取数据,就应该创建数据框对象,它本身为数据添加了很多功能,因此需要更多内存。您无法将此数据放入内存中。我这里只能想到dask
  • 大约 45% 的内存被其他应用程序占用。我希望如果我占用 15Gb 文件的 20%,那么剩余的 RAM 就足够了。顺便说一下,我还包括了数据类型的规范。
  • 您是否在read_csv中指定了要使用的行数?
  • 否,因为我需要检查整个文件以检查我的 20% 子集的条件符合哪些行。

标签: python csv memory pycharm allocation


【解决方案1】:

我认为您使用 15 Gb 的内存只是为了读取您的文件,因为我猜即使您指定块/迭代器使用 20% 的文件,read_csv() 函数也会访问整个文件,不包括您正在运行的 windows 和 pycharm 至少需要 1 Gb 的内存,所以把所有的东西加起来,我猜你内存不足。

但这些都是要面对你的问题。

  • 验证数组的 dtype,并尝试找到最适合您的目的。例如,您使用的是 float64,请考虑 float32 甚至 float16 是否合适。
  • 考虑是否可以在数据子集上完成计算。这称为二次抽样。也许使用二次抽样可以获得足够好的模型(对于 Kmean 这样的聚类算法可能就是这种情况)。
  • 您可以搜索核外解决方案。这可能是重新考虑您的算法(您能否拆分工作),或者尝试一种透明的解决方案。

【讨论】:

  • 您能否具体说明您是如何到达 15.628395080566406 Gb 的?
  • 不能把csv文件拆分成两个文件吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 2017-08-13
  • 2011-03-23
  • 2016-04-18
  • 2013-10-22
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多