【发布时间】:2017-03-21 15:13:53
【问题描述】:
我有一个 1gb 的 csv 文件。该文件有大约 10000000(10 百万)行。我需要遍历行以获得几个选定行的最大值(基于条件)。问题是读取 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 位]
我有 4GB 内存。
Numpy 最新(pip 安装程序说安装了最新版本)
Pandas 最新。(pip 安装程序显示已安装最新版本)
【问题讨论】:
-
问题是您正试图将整个文件读入内存。块读取是写入方法,但是您通过尝试使用
pd.concat来消除好处。您应该计算每个块的最大值,并且只将最大值从一个块带到另一个块。我希望这是有道理的。 -
如果您对列的最大值感兴趣,最好的解决方案可能是编写一个通过您的 csv 文件流式传输的生成器,并迭代地计算最大值,即一起绕过
pandas。 -
我发现 Python 3.0+ 可以解决这个问题。
-
运行 python 64 位将使用完整的 4gb 内存。您的 32 位 python 只能使用 4gb 的一部分。 stackoverflow.com/a/18282931/2327328
-
如果找到最大值的条件不是聚合的,那么您最好逐行读取 csv 并将所需的最大值存储在变量中。 stackoverflow.com/a/38058980/2327328
标签: python csv pandas numpy large-files