Python 0.18:读取带有类别的CSV文件时出现内存不足错误
我试图用Python 0.18:读取带有类别的CSV文件时出现内存不足错误,python,pandas,csv,categorical-data,Python,Pandas,Csv,Categorical Data,我试图用read\u csv函数将3GB文件(250万行,大部分是分类(字符串)数据)读取到Pandas数据框中,并得到错误:内存不足 我在一台装有熊猫0.18版本和16GB内存的PC上,所以3GB的数据应该可以轻松地放在16GB上。(更新:这不是一个重复的问题) 我知道我可以提供dtype来改进CSV的读取,但是我的数据集中有太多的列,我想先加载它,然后决定数据类型 回溯是: Traceback (most recent call last): File "/home/a/Dropbo
read\u csv
函数将3GB文件(250万行,大部分是分类(字符串)数据)读取到Pandas数据框中,并得到错误:内存不足
- 我在一台装有熊猫0.18版本和16GB内存的PC上,所以3GB的数据应该可以轻松地放在16GB上。(更新:这不是一个重复的问题)
- 我知道我可以提供
来改进CSV的读取,但是我的数据集中有太多的列,我想先加载它,然后决定数据类型dtype
Traceback (most recent call last):
File "/home/a/Dropbox/Programming/Python/C and d/main.com.py", line 9, in <module>
preprocessing()
File "/home/a/Dropbox/Programming/Python/C and d/main.com.py", line 5, in preprocessing
df = pd.read_csv(filepath_or_buffer = file_path, sep ='\t', low_memory = False)
File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 498, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 285, in _read
return parser.read()
File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 747, in read
ret = self._engine.read(nrows)
File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 1197, in read
data = self._reader.read(nrows)
File "pandas/parser.pyx", line 769, in pandas.parser.TextReader.read (pandas/parser.c:8011)
File "pandas/parser.pyx", line 857, in pandas.parser.TextReader._read_rows (pandas/parser.c:9140)
File "pandas/parser.pyx", line 1833, in pandas.parser.raise_parser_error (pandas/parser.c:22649)
pandas.parser.CParserError: Error tokenizing data. C error: out of memory
上面的代码产生了错误消息,我在上面发布了
然后我尝试删除低内存=False
,但一切正常,它只给出了警告:
sys:1: DtypeWarning: Columns (17,20,23,24,33,44,58,118,134,
135,137,142,145,146,147) have mixed types.
Specify dtype option on import or set low_memory=False.
更新:在: 因此,您可以尝试使用0.19.0 RC1 旧答案: 您可以分块读取CSV,并在每个步骤中将其连接到生成的DF:
chunksize = 10**5
df = pd.DataFrame()
for chunk in (pd.read_csv(filename,
dtype={'col1':np.int8, 'col2':np.int32, ...}
chunksize=chunksize)
):
df = pd.concat([df, chunk], ignore_index=True)
注意:engine='python'不支持参数
dtype
问题重复:
- (除非您使用
或df.info(memory\u usage='deep')
,否则pandas将低估带字符串的数据帧的内存使用情况。)df.memory\u usage(deep=True)
- 只读取列的子集,例如
usecols=['foo'、'bar'、'baz']
- 仅读取行的子集(例如
或另请参见nrows=1e5
)skiprows=…
- 然后迭代计算出每个分类的级别以及它使用了多少内存。您不需要读取所有行或列来计算一个分类列的级别
你可以试试@MaxU谢谢你的建议。还可以指定
dtype
以减少内存消耗。请删除重复的标签。你所指的问题陈述得很差。在Pandas文档中,您找不到对文件大小的限制,因此,无论您的文件大小是6GB还是600TB,以及是否有足够的RAM,它都可能会很慢,但这不是重点。以前,熊猫的内存处理中存在错误,问题已经解决。这一个似乎也是错误,所以它需要适当的注意。你能发布一个完整的错误回溯吗?当然,您可以使用dtype
,但我们看不到您的数据,因此我们无法向您建议dtype
参数的值。。。
pd.read_csv(filename, dtype={'col1': 'category'})
chunksize = 10**5
df = pd.DataFrame()
for chunk in (pd.read_csv(filename,
dtype={'col1':np.int8, 'col2':np.int32, ...}
chunksize=chunksize)
):
df = pd.concat([df, chunk], ignore_index=True)