内存不足时发生Python Pandas Dataframe内存错误



我在windows 8上使用python 3.8 64位和Pycharm。我在尝试从列表中生成数据帧时遇到内存错误。

我想做的是使用csv包将一个巨大的.csv(25gb(读取到一个列表中,使用pd.Dataframe制作一个数据帧,然后使用pd.to_stata函数导出一个.dta文件。我的内存是64gb,比数据大很多。

这是错误消息:

MemoryError: Unable to allocate 25.8 GiB for an array with shape (77058858, 45) and data type object

我发现了三个类似的问题,但都不适合我

  1. 问题1:该解决方案对我不起作用,因为我使用的是64位python
  2. 这个问题的答案表明内存错误是因为电脑没有足够的内存,但我很确定我有足够的内存来处理这些数据
  3. 在这篇文章中,作者在试图读取一个巨大的csv时出现内存错误,解决方案是逐段读取数据。我知道我也可以这样做,但我想知道是否有更清洁的方法来解决这个问题

这是我的代码:

import csv
import itertools
import pandas as pd
colname= ["id","attachmentPath",...(20 other column names),"eventid"]
reader = csv.reader(open(r'test.csv', encoding = "ISO-8859-1"), quotechar='"',delimiter=',', skipinitialspace=False, escapechar='\')
# read full sample
records = []
for record in itertools.islice(reader,1,77058860): # 77058860 is the length of the csv
records.append(record)
df = pd.DataFrame(records(reader,1,77058860): columns=colname)
statapath = r'stata_output.dta'
df.to_stata(statapath, version=117, write_index=False)

我认为您的数据集对于RAM来说太大了。Wes McKinney(Pandas的创建者(在2017年的一篇博客文章中指出:

简单地说,2011年我们没有考虑分析100 GB或1 TB的数据集。现在,我对熊猫的经验法则是,你的RAM应该是数据集大小的5到10倍因此,如果你有一个10 GB的数据集,如果你想避免内存管理问题,你实际上应该有大约64,最好是128 GB的RAM。这让那些希望能够分析计算机RAM大小在2或3倍以内的数据集的用户感到震惊。【麦金尼原始文件中的重点】

来源:https://wesmckinney.com/blog/apache-arrow-pandas-internals/

您可能需要对数据集进行分块处理。根据数据集的不同,有几种方法可以降低内存需求:

  • 将低基数数据转换为类别
  • 使用最小大小的数字类型(例如,int64到int8(

此处提供更多信息:https://pandas.pydata.org/docs/user_guide/scale.html

最新更新