我在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:该解决方案对我不起作用,因为我使用的是64位python
- 这个问题的答案表明内存错误是因为电脑没有足够的内存,但我很确定我有足够的内存来处理这些数据
- 在这篇文章中,作者在试图读取一个巨大的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