为什么我的熊猫数据框使用这么多内存?

时间:2018-07-26 14:32:05

标签: python json pandas machine-learning xgboost

我有一个要读取的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)

我的定向程序的总大小为4.5G,但是当我使用top检查进程使用的内存时,发现读取完成后该进程使用30G。 为什么会这样?我只读取4.5G json文件,但已使用30G内存,如何避免这种情况?

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

2 个答案:

答案 0 :(得分:0)

似乎您将所有数据帧存储在df_test_list中,然后将串联的数据帧保存在df_test中。这样一来,您的内存中就会有许多不必要的数据。一个list big 个数据帧对象会很昂贵

避免保存第一个列表

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

或将其抽象到其他范围,例如函数。

这样,您将有一个 peak 的内存消耗量,但是最终的内存使用量将低于当前的内存使用量。

我还建议您阅读this answer并从内存使用量测评中获得一些见识。

答案 1 :(得分:0)

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

您可以指定以下类型:

column_types = {'col_a': np.float64,
                'col_b': object,
                'col_c': 'category'}

pd.read_json("path/to/json", dtype=column_types)

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

del df_test_list