Как повысить производительность django bulk_create для больших наборов данных? (PostgreSQL) - PullRequest
0 голосов
/ 17 июня 2020

У меня есть большие csv-файлы примерно с 164 столбцами x 50000 строк, и я хотел бы импортировать эти файлы в PostgreSQl -Database (12.2).

Используя Django 3.0.7 и Python 3.6.8 Я создал модель DataRow с одним полем для каждого столбца. При импорте файла я сначала проверяю его, проверяя отсутствие значений и так далее. Затем я создаю DataRow -объект для каждой строки и пытаюсь загрузить все в базу данных, используя bulk_create. Вот стилизованная короткая версия моего кода:

import pandas as pd

data = pd.read_csv(myfile)

validate_my_data(data)

data_row_objects = []
for row in data:
    data_row_objects.append(DataRow(**row_to_dict(row)))

DataRow.objects.bulk_create(data_row_objects, batch_size=3000)

Пока это работает. Проверка и добавление всех объектов в data_row_objects занимает около 8 секунд, и это нормально. Однако оператор bulk_create занимает около 3 минут, что неприемлемо.

Итак, как я могу улучшить производительность здесь? Я уже пробовал увеличивать / уменьшать batch_size, но 3000, кажется, пока самый стабильный размер.

Я также читал некоторые сообщения здесь, в stackoverflow, что импорт файла csv непосредственно в базу данных выполняется намного быстрее . Однако я бы предпочел использовать чистый django только потому, что, на мой взгляд, это одна из точных целей django: избегать прямого взаимодействия с базами данных.

Или мне нужно изменить настройки для моего PostgreSQL? Возможно, это медленнее, так как оба django и PostgreSQL находятся внутри отдельного docker -контейнера.

Честно говоря, мне довольно сложно отличить guish узкое место производительность здесь, потому что я все еще новичок с точки зрения django и баз данных. Но я думаю, что должен быть быстрый и элегантный способ, потому что мои наборы данных совсем не такие большие и импорт таких файлов должен быть довольно распространенной задачей.

Жду ваших ответов, Том

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