Pandas.read_csv()内存

2024-04-19 19:12:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我使用Python的Pandas包。函数的作用是:读取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位]

  • 我有4GB内存。

  • Numpy最新版本(pip安装程序显示已安装最新版本)

  • 熊猫最新。(pip安装程序说安装了最新版本)


Tags: 文件csv函数内存io版本truefloat
3条回答

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

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

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

Pandas read_csv()具有低内存标志。

tp  = pd.read_csv('capture2.csv',low_memory=True, ...)

只有在使用C解析器时,low_memory标志才可用

engine : {‘c’, ‘python’}, optional

Parser engine to use. The C engine is faster while the python engine is currently more feature-complete.

您也可以使用内存映射标志

memory_map : boolean, default False

If a filepath is provided for filepath_or_buffer, map the file object directly onto memory and access the data directly from there. Using this option can improve performance because there is no longer any I/O overhead.

source


p.s.使用64位python-请参阅我的评论

如果试图读取的文件太大,无法作为一个整体包含在内存中,则也无法将其分块读取,然后将其重新组合到内存中,因为最终至少需要同样多的内存。

您可以尝试在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的最大值。

相关问题 更多 >