【发布时间】: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