Как предварительно выделить память при создании pandas DataFrames - PullRequest
1 голос
/ 21 июня 2020

Во время выполнения моей работы я хочу построить pandas DataFrame с его внутренним состоянием на каждом этапе выполнения. Я хочу сделать это, потому что хочу иметь возможность позже использовать DataFrame для анализа. Итак, это контекст: я начинаю с пустого DataFrame, и после того, как задание завершает создание всех своих данных, окончательный размер DataFrame составляет 7 ГБ (максимум).

Это подходы, которые я пробовал far:

  1. Я могу вести список списков, моя работа продолжает добавлять новые строки в этот список. В конце я запускаю что-то вроде: df = pd.DataFrame(rows, columns=list("abc")). Это самый быстрый метод, но он очень расточителен с точки зрения использования памяти.
  2. Я больше не использую списки списков, а вместо этого продолжаю звонить df = df.append([{"a": 1.0, "b": 1.0, "c": "hello"}]). Все начинается нормально, но по мере роста DataFrame начинается копирование большого количества памяти, и оно становится очень медленным.

Итак, ни один из них не идеален. Я могу оценить окончательный размер DataFrame до того, как мое задание будет запущено (я думаю, что обычно могу точно сопоставить размер, если честно), поэтому я хотел бы сказать pandas, чтобы выделить всю память вперед (или, по крайней мере, большой достаточно куска, чтобы продержаться какое-то время), а затем мне нужен метод, аналогичный df.append, который просто добавит новую строку в конец предварительно выделенной памяти. В идеале было бы достаточно умен, чтобы при необходимости изменить размер памяти.

Возможно, я чего-то сильно упускаю, но я искренне не мог найти способ сделать это, где бы я ни смотрел.

1 Ответ

1 голос
/ 21 июня 2020

Используйте подход 1, но каждый раз, когда вы получаете (скажем) 10000 строк, преобразуйте список списков в DataFrame, добавьте фрейм данных в список фреймов данных и очистите список списков (установив для него значение [] ). В конце возьмите свой список блоков df и pd.concat их вместе.

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