Создание экземпляров модели django из фрейма данных без таймаута сервера
Я загружаю застегнутый файл, который содержит один файл CSV. Затем я распаковываю его на сервере и загружаю в датафрейм. Затем я создаю из него объекты django.
Это работает нормально, пока мой массив данных не становится слишком большим. Когда набор данных становится слишком большим, сервер django выключается. Я предполагаю, что это происходит потому, что каждая итерация в моем цикле увеличивает память, и когда места в памяти не остается, он отключается. Я работаю с большими наборами данных и хочу, чтобы мой код работал независимо от размера датафрейма.
Представьте, что у меня есть такой df:
cola fanta sprite libella
2018-01-01 00:00:00 0 12 12 34
2018-01-01 01:00:00 1 34 23 23
2018-01-01 02:00:00 2 4 2 4
2018-01-01 03:00:00 3 24 2 4
2018-01-01 04:00:00 4 2 2 5
Представьте, что столбцов может быть до 1000 марок, а строк может быть более полумиллиона. Далее представьте, что у меня есть модель, которая сохраняет эти данные в поле JSONB. Таким образом, каждый столбец - это объект django, имя столбца - это название. Временная метка в сочетании с данными в столбце является полем JSONB.
например: name=fanta, json_data={ "2018-01-01 00:00:00": 12, "2018-01-01 01:00:0": 34 }
Мой код для распаковки, загрузки в df и последующего создания экземпляра django выглядит так:
df = pd.read_csv(
file_decompressed.open(name_file),
index_col=0,
)
for column_name in df:
Drink.objects.create(
name=column_name,
json_data=df[column_name].to_dict(),
)
Как я уже сказал, это работает, но мой цикл обрывается после создания примерно 15 элементов. Поискав в интернете, я обнаружил, что bulk_create
может сделать это более эффективным. Но у меня реализованы пользовательские сигналы, так что это не совсем решение. Я также думал об использовании to_sql
, но поскольку мне нужно реструктурировать данные датафрейма, я не думаю, что это сработает. Может быть, вообще не использовать pandas? Может быть, как-то разбить DF на части?
Я ищу решение, которое работает независимо от количества столбцов. Количество строк - максимум полмиллиона строк. Я также пробовал цикл while, но возникает та же проблема.
Есть идеи, как я могу заставить это работать? За помощь буду очень признателен.
Моя фиктивная модель может быть такой простой, как:
class Juice(models.Model):
name = CharField(...)
json_data = JSONField(...)