查看: 2170|回复: 4

pandas MemoryError:

[复制链接]

10

主题

82

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
发表于 2018-9-18 16:39:49 | 显示全部楼层 |阅读模式
本帖最后由 污妖王 于 2018-9-18 17:48 编辑

我使用pandas.read_csv读取一个大的csv文件(aprox.6 GB),我收到以下内存错误:
  1. MemoryError                               Traceback (most recent call last)
  2. <ipython-input-58-67a72687871b> in <module>()
  3. ----> 1 data=pd.read_csv('aphro.csv',sep=';')

  4. C:\Python27\lib\site-packages\pandas\io\parsers.pyc in parser_f(filepath_or_buffer, sep, dialect, compression, doublequote, escapechar, quotechar, quoting, skipinitialspace, lineterminator, header, index_col, names, prefix, skiprows, skipfooter, skip_footer, na_values, na_fvalues, true_values, false_values, delimiter, converters, dtype, usecols, engine, delim_whitespace, as_recarray, na_filter, compact_ints, use_unsigned, low_memory, buffer_lines, warn_bad_lines, error_bad_lines, keep_default_na, thousands, comment, decimal, parse_dates, keep_date_col, dayfirst, date_parser, memory_map, nrows, iterator, chunksize, verbose, encoding, squeeze, mangle_dupe_cols, tupleize_cols, infer_datetime_format)
  5.     450                     infer_datetime_format=infer_datetime_format)
  6.     451
  7. --> 452         return _read(filepath_or_buffer, kwds)
  8.     453
  9.     454     parser_f.__name__ = name

  10. C:\Python27\lib\site-packages\pandas\io\parsers.pyc in _read(filepath_or_buffer, kwds)
  11.     242         return parser
  12.     243
  13. --> 244     return parser.read()
  14.     245
  15.     246 _parser_defaults = {

  16. C:\Python27\lib\site-packages\pandas\io\parsers.pyc in read(self, nrows)
  17.     693                 raise ValueError('skip_footer not supported for iteration')
  18.     694
  19. --> 695         ret = self._engine.read(nrows)
  20.     696
  21.     697         if self.options.get('as_recarray'):

  22. C:\Python27\lib\site-packages\pandas\io\parsers.pyc in read(self, nrows)
  23.    1137
  24.    1138         try:
  25. -> 1139             data = self._reader.read(nrows)
  26.    1140         except StopIteration:
  27.    1141             if nrows is None:

  28. C:\Python27\lib\site-packages\pandas\parser.pyd in pandas.parser.TextReader.read (pandas\parser.c:7145)()

  29. C:\Python27\lib\site-packages\pandas\parser.pyd in pandas.parser.TextReader._read_low_memory (pandas\parser.c:7369)()

  30. C:\Python27\lib\site-packages\pandas\parser.pyd in pandas.parser.TextReader._read_rows (pandas\parser.c:8194)()

  31. C:\Python27\lib\site-packages\pandas\parser.pyd in pandas.parser.TextReader._convert_column_data (pandas\parser.c:9402)()

  32. C:\Python27\lib\site-packages\pandas\parser.pyd in pandas.parser.TextReader._convert_tokens (pandas\parser.c:10057)()

  33. C:\Python27\lib\site-packages\pandas\parser.pyd in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10361)()

  34. C:\Python27\lib\site-packages\pandas\parser.pyd in pandas.parser._try_int64 (pandas\parser.c:17806)()

  35. MemoryError:
复制代码



回复

使用道具 举报

11

主题

80

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2018-9-18 16:41:03 | 显示全部楼层
该错误表明机器没有足够的内存来将整个CSV一次读入DataFrame。假设您一次不需要内存中的整个数据集,避免问题的一种方法是以块的形式处理CSV(通过指定chunksize参数):
  1. chunksize = 10 ** 6
  2. for chunk in pd.read_csv(filename, chunksize=chunksize):
  3.     process(chunk)
复制代码

回复

使用道具 举报

10

主题

72

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2018-9-18 16:42:09 | 显示全部楼层
  1. chunks=pd.read_table('aphro.csv',chunksize=1000000,sep=';',\
  2.        names=['lat','long','rf','date','slno'],index_col='slno',\
  3.        header=None,parse_dates=['date'])

  4. df=pd.DataFrame()
  5. %time df=pd.concat(chunk.groupby(['lat','long',chunk['date'].map(lambda x: x.year)])['rf'].agg(['sum']) for chunk in chunks)
复制代码

回复

使用道具 举报

9

主题

74

帖子

185

积分

注册会员

Rank: 2

积分
185
发表于 2018-9-18 16:44:59 | 显示全部楼层
分块不应该总是这个问题的第一个解决方案。
1.由于重复的非数字数据或不需要的列,文件是否很大?
如果是这样,您有时可以通过读取列作为类别并通过pd.read_csv  usecols参数选择所需列来节省大量内存。
2.您的工作流程是否需要切片,操作,导出?
如果是这样,您可以使用dask.dataframe进行切片,执行计算并迭代导出。通过dask静默执行分块,它也支持pandas API的子集。
3.如果所有其他方法都失败了,请通过块逐行读取。
是以块的形式处理CSV作为最后的手段。

回复

使用道具 举报

5

主题

41

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2018-10-10 08:13:41 | 显示全部楼层
数据集太大了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表