【问题标题】:Why my pandas dataframe use so many memory?为什么我的熊猫数据框使用这么多内存?
【发布时间】:2019-01-03 14:22:19
【问题描述】:

我有一个json文件的方向要读取,所以我使用以下代码:

test_filelist = os.listdir('myDir') 
df_test_list = [pd.read_json( os.path.join('myDir',file),lines=True ) for file in test_filelist if file.endswith('json') ] 
df_test = pd.concat(df_test_list)

我的direction的总大小是4.5G,但是当我使用top查看我的进程使用的内存时,我发现这个进程在读取完成时使用了30G。 为什么会这样?我只读取了4.5G的json文件,却使用了30G的内存,如何避免呢?

我打印了df_test.info(),它告诉我这个数据帧只使用了 177.7 MB 内存,为什么?

【问题讨论】:

    标签: python json pandas machine-learning xgboost


    【解决方案1】:

    似乎您将所有数据帧存储在df_test_list 中,然后将连接的数据帧保存在df_test 中。这样,您的内存中就会有大量不必要的数据。一个list 数据框对象会很昂贵

    避免保存第一个列表

    df_test = pd.concat([pd.read_json( os.path.join('myDir',file),lines=True ) for file in test_filelist if file.endswith('json')])
    

    或将其抽象到不同的范围,例如函数。

    这样你会有一个峰值的内存消耗,但最终的内存使用量会低于你当前的。

    我还建议阅读this answer,了解内存使用情况。

    【讨论】:

    • 我试过你的方法,但最后还是用了30G...另外,我打印df_test.info(),它告诉我内存是177.7MB+,我看不懂
    • try df_test.memory_usage(deep=True) 默认情况下忽略对象列。
    【解决方案2】:

    您可以指定列的类型,这对内存占用有很大帮助,特别是对于诸如分类变量(通常默认加载为对象类型)之类的类型,以便将重复项映射到内存中的相同位置.

    您可以按如下方式指定类型:

    column_types = {'col_a': np.float64,
                    'col_b': object,
                    'col_c': 'category'}
    
    pd.read_json("path/to/json", dtype=column_types)
    

    对于您的代码,您还可以在创建 df_test 后删除 df_test_list 以释放内存,例如

    del df_test_list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      相关资源
      最近更新 更多