Pandas.read_csv()MemoryError

时间:2017-03-21 15:13:53

标签: python csv pandas numpy large-files

我有一个1GB的csv文件。该文件有大约10000000(10 Mil)行。我需要遍历行以获得几个选定行的最大值(基于条件)。问题是正在读取csv文件。

我使用Python的Pandas包。 read_csv()函数在读取csv文件时抛出MemoryError。 1)我试图将文件拆分成块并读取它们。现在,concat()函数存在内存问题。

tp  = pd.read_csv('capture2.csv', iterator=True, chunksize=10000, dtype={'timestamp': float, 'vdd_io_soc_i': float, 'vdd_io_soc_v': float,  'vdd_io_plat_i': float, 'vdd_io_plat_v': float, 'vdd_ext_flash_i': float,   'vdd_ext_flash_v': float,   'vsys_i vsys_v': float, 'vdd_aon_dig_i': float, 'vdd_aon_dig_v': float, 'vdd_soc_1v8_i': float, 'vdd_soc_1v8_v': float})

df = pd.concat(tp,ignore_index=True)

我已经使用了dtype来减少内存耗尽,但仍然没有任何改进。

基于多篇博文。 我已将numpy,pandas更新到最新版本。仍然没有运气。

如果有人能解决这个问题,那将会很棒。

请注意:

  • 我有一个64位操作系统(Windows 7)

  • 我正在运行Python 2.7.10(默认,2015年5月23日,09:40:32)[MSC v.1500 32 bit]

  • 我有4GB Ram。

  • Numpy latest(pip安装程序说安装了最新版本)

  • Pandas Latest。(pip安装程序说安装了最新版本)

3 个答案:

答案 0 :(得分:1)

如果您尝试读取的文件太大而无法作为整体包含在内存中,您也无法以块的形式读取它,然后在内存中重新组合它,因为最终需要至少同样多的内存。

您可以尝试在chuncks中读取文件,过滤掉每个chunck中不必要的行(根据您提到的条件),然后重新组合数据帧中的其余行。

这给出了类似的东西:

df = pd.concat(apply_your_filter(chunck_df) for chunck_df in pd.read_csv('capture2.csv', iterator=True, chunksize=10000, dtype={'timestamp': float, 'vdd_io_soc_i': float, 'vdd_io_soc_v': float, 'vdd_io_plat_i': float, 'vdd_io_plat_v': float, 'vdd_ext_flash_i': float, 'vdd_ext_flash_v': float, 'vsys_i vsys_v': float, 'vdd_aon_dig_i': float, 'vdd_aon_dig_v': float, 'vdd_soc_1v8_i': float, 'vdd_soc_1v8_v': float}), ignore_index=True)

和/或找到每个chunck的最大值,然后找出每个chunck maxs的最大值。

答案 1 :(得分:1)

Pandas read_csv()的内存标记很低。

Bootstrap

只有使用C解析器

时,low_memory标志才可用
  

引擎:{'c','python'},可选

     

使用解析器引擎。 C引擎速度更快,而python引擎目前功能更完善。

您也可以使用memory_map标志

  

memory_map:boolean,默认为False

     

如果为filepath_or_buffer提供了文件路径,则将文件对象直接映射到内存并直接从那里访问数据。使用此选项可以提高性能,因为不再有任何I / O开销。

source

P.S。使用64位python - 请参阅我的评论

答案 2 :(得分:-2)

你能检查一下Python版本吗? 可能你有32位有一些限制。

尝试安装64位并尝试将数据加载到pandas中,而不使用concat,如:

df = pd.read_csv('/path/to/csv')