У меня есть большие 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 и баз данных. Но я думаю, что должен быть быстрый и элегантный способ, потому что мои наборы данных совсем не такие большие и импорт таких файлов должен быть довольно распространенной задачей.
Жду ваших ответов, Том