我有一个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安装程序说安装了最新版本)
答案 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开销。
P.S。使用64位python - 请参阅我的评论
答案 2 :(得分:-2)
你能检查一下Python版本吗? 可能你有32位有一些限制。
尝试安装64位并尝试将数据加载到pandas中,而不使用concat,如:
df = pd.read_csv('/path/to/csv')