У меня есть ориентир 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 МБ, почему?
Вы можете указать типы столбцов, и это очень помогает с объемом памяти, особенно с такими типами, как категориальные переменные (которые обычно загружаются как тип объекта по умолчанию), так что дубликаты сопоставляются с одним и тем же местом в памяти.
Вы можете указать следующие типы:
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
Похоже, что вы сохраняете все кадры данных в df_test_list
а затем сохраняете кадр конкатенированных данных в df_test
. Таким образом, у вас в памяти много ненужных данных. list
больших объектов dataframe будет дорогостоящим
Избегайте сохранения первого списка
df_test = pd.concat([pd.read_json( os.path.join('myDir',file),lines=True ) for file in test_filelist if file.endswith('json')])
или абстрагироваться в другой области, такой как функция.
Таким образом, у вас будет пик потребления памяти, но конечная память будет ниже вашего текущего.
Я бы также рекомендовал прочитать этот ответ с некоторыми соображениями по использованию памяти.
df_test.memory_usage(deep=True)
Объектные столбцы по умолчанию игнорируются.