pandas DataFrame.update и DataFrame.combine_first OOM при обновлении df1 с помощью df2 - PullRequest
0 голосов
/ 22 сентября 2019

У меня большой DataFrame с миллионами строк, который я хочу переиндексировать.Этот переиндекс увеличивает коллектор таблицы.К сожалению, переиндексация завершилась сбоем из-за нехватки памяти. *

Сейчас я попробовал следующее: я создаю пустой DataFrame и просто помещаю туда (новый) индекс, который работает.

Далее я хотел обновить новый DataFrame данными из «старого».

df_target.update(df_source)  

К сожалению, снова метод обновления создает OOM, а также метод comb_first также создает OOM.

df_target = df_target.combine_first(df_source) # OOM

То, что я пробовал сейчас, использует loc:

df_target.loc[df_source.index,:] = df_source

Это похоже на тихое постоянное использование памяти.Но это занимает вечность.Теперь он работает по крайней мере 3 часа, и я позволю ему продолжать работать.

Мой первый вопрос: почему update и Объединение_фирта вызывает OOM через несколько минут (на моей машине подготовлено 64 ГБ и ~ 128 ГБ Swap дляиспользовать)?Исходные данные представляют собой таблицу размером 200 МБ.Моя идея метода обновления заключается в том, что он должен просто делать что-то похожее на то, что делает loc, так как он может так быстро поглотить всю мою память?

Почему Объединение_первых также поглощает всю память?Разве объединение_первых не просто перебирает по индексу и проверяет, можно ли его комбинировать?

Я знаю, что могу обработать исходный DataFrame «шаг за шагом». Но проблема в том, что даже меньший мусор (1из 26000), кажется, вызывает OOM с методом обновления. Что я не могу объяснить, почему, потому что это наименьший мусор составляет всего несколько МБ, и даже результат максимального размера не может быть больше, чем (абсолютный максимум в худшем случае на числострок и ячеек) около 100 МБ.

* Я не совсем уверен, действительно ли это OOM, потому что в сообщении об ошибке просто говорится «Ошибка атрибута: Память:» без каких-либо дополнительных подробностей. Но я вижучто память на некоторое время достигает максимума, а затем используется своп до тех пор, пока не произойдет сбой и не появится сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...