【问题标题】:Pandas.read_csv() MemoryErrorPandas.read_csv() 内存错误
【发布时间】: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


【解决方案1】:

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

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

这给出了类似的东西:

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)

和/或找到每个块的最大值,然后找到每个块的最大值。

【讨论】:

    【解决方案2】:

    Pandas read_csv() 有一个内存不足标志。

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

    low_memory 标志仅在使用 C 解析器时可用

    引擎:{‘c’,‘python’},可选

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

    您也可以使用 memory_map 标志

    memory_map : 布尔值,默认为 False

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

    source


    附言使用 64 位 python - 看我的评论

    【讨论】:

    • 这很好,但您可能想探索使用csv 执行此任务的解决方案。在上述实现中,您仍然可能受到内存的限制,但您尝试执行的计算类型应该只有时间限制。
    • 我添加了一条评论,建议在没有熊猫的情况下逐行阅读 csv,但也许 OP 需要聚合函数来计算最大值(如移动平均线)
    • 我试图让它在 64 位 Python 上工作。没运气。我得到相同的内存错误。尝试使用“Low_memory =True”和同样的错误。 “文件“pandas\parser.pyx”,第 2049 行,在 pandas.parser._concatenate_chunks (pandas\parser.c:27557) MemoryError 中。尝试使用 memory_map =True。我得到了完全相同的错误。我做错了什么吗?
    • 抱歉,使用 Low_memory 游戏的第一个解决方案我出错了,下面是 usage.df = pd.read_csv('capture2.csv', engine={'c', 'python'}, low_memory= True ) 错误:self._engine = klass(self.f, **self.options) UnboundLocalError: local variable 'klass' referenced before assignment
    • engine='c'{'c', 'python'} 只是显示选项是什么
    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 2019-02-05
    • 2023-03-17
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    相关资源
    最近更新 更多