【问题标题】:Loading large csv file in pandas在熊猫中加载大型csv文件
【发布时间】:2018-03-19 09:06:08
【问题描述】:

我正在尝试在 pandas 数据框中加载 csv 文件。但是,Python 在加载文件时会占用大量内存。例如,csv 文件的大小为 289 MB,但当我尝试加载文件时,内存使用量约为 1700 MB。此时,系统显示内存错误。我也尝试过块大小,但问题仍然存在。谁能告诉我前进的方向?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    好的,首先,不要混淆磁盘大小和内存大小。 csv 的核心是纯文本文件,而 pandas 数据框是加载在内存中的复杂对象。也就是说,考虑到我不知道您的 csv 中有什么,我无法就您的具体情况发表声明。因此,我将在我的计算机上为您提供一个具有相似大小的 csv 示例:

    -rw-rw-r--  1 alex users 341M Jan 12  2017 cpromo_2017_01_12_rec.csv
    

    现在读取 CSV:

    >>> import pandas as pd
    >>> df = pd.read_csv('cpromo_2017_01_12_rec.csv')
    >>> sys:1: DtypeWarning: Columns (9) have mixed types. Specify dtype option on import or set low_memory=False.
    >>> df.memory_usage(deep=True).sum() / 1024**2
    1474.4243307113647
    

    Pandas 会尽可能地优化它,但它无法做到不可能的事情。如果您的内存不足,请this answer is a good place to start。或者,您可以尝试dask,但我认为这对于小型 csv 来说工作量太大。

    【讨论】:

    • 我已经找到原因了。如果我使用 skipfooter,内存使用量会达到 1.7 GB。否则大约 600 MB。
    【解决方案2】:

    您可以使用库“dask”
    例如:

    # Dataframes implement the Pandas API
    import dask.dataframe as dd`<br>
    df = dd.read_csv('s3://.../2018-*-*.csv')
    

    【讨论】:

      【解决方案3】:

      像这样尝试 - 1) 使用 dask 加载,然后 2) 转换为 pandas

      import pandas as pd
      import dask.dataframe as dd
      import time
      t=time.clock()
      df_train = dd.read_csv('../data/train.csv', usecols=[col1, col2])
      df_train=df_train.compute()
      print("load train: " , time.clock()-t)
      

      【讨论】:

        猜你喜欢
        • 2013-07-30
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 2018-12-02
        • 2015-10-22
        • 2017-10-21
        相关资源
        最近更新 更多