Почему мой фрейм данных pandas использует так много памяти?

1

У меня есть ориентир 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 МБ, почему?

Теги:
pandas
machine-learning
xgboost

2 ответа

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
0

Похоже, что вы сохраняете все кадры данных в 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')])

или абстрагироваться в другой области, такой как функция.

Таким образом, у вас будет пик потребления памяти, но конечная память будет ниже вашего текущего.

Я бы также рекомендовал прочитать этот ответ с некоторыми соображениями по использованию памяти.

  • 0
    Я попробовал ваш метод, но он все еще использовал 30G, наконец ... Кроме того, я печатаю df_test.info (), он сказал мне, что память 177,7 МБ +, я не могу понять
  • 0
    try df_test.memory_usage(deep=True) Объектные столбцы по умолчанию игнорируются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню