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上。(更新:这不是一个重复的问题)
  • 我知道我可以提供
    dtype
    来改进CSV的读取,但是我的数据集中有太多的列,我想先加载它,然后决定数据类型
回溯是:

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')
      df.memory\u usage(deep=True)
      ,否则pandas将低估带字符串的数据帧的内存使用情况。)
  • 从0.19开始,现在不需要指定每个分类变量的级别。只需执行pd.read_csv(…,dtype={'foo':'category','bar':'category',…})
  • 这应该解决所有问题。在极不可能发生的情况下,您的内存仍然不足,然后也要进行如下调试:
    • 只读取列的子集,例如
      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)