我有一个要读取的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的内存,为什么?
答案 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