строк в БД. Вот основные момент кода: https://codeshare.io/2KVX6X
пытаюсь сделать bulk_create с указанием batch_size, но исхода два: 1. Если большой батч сайз, то заканчивается оперативка и БД вылетает с ошибкой 2. Если батч сайз слишком маленький, то улетает куча запросов в БД + заполнение происходит долго.
Может ли быть проблема в том, что каждая строка, которую я хочу добавить, имеет связанный ForeignKey? Как можно исправить ситуацию?(
Ну неужели никто миллион записей в БД не вносил?)
за раз это долго, и зависит от размера записей и еще разных параметров
Да пусть хоть 5, хоть 10 минут грузится. Как правильно это сделать?
ну зависит от того как нужно это делать, для джанги есть иморт \ экспорт либы, а еще можно написать менеджмент команду и запускать с указанием файла - типа python manage.py import_data filename если база sqlite то будет очень долгая вставка, если создаются индексы сразу то будет очень долго тоже, зависит от полей конечно) для интовых не сильно как для текстовых
Я по 50к в одном queryset грузил, все было ок.
К одному миллиону имеется ввиду
На postgresql
> Если батч сайз слишком маленький, то улетает куча запросов в БД + заполнение происходит долго так запустили бы и я за 2 недели явно загрузилось
Только мне надо 3 раза в день обновлять))
ну записать 3миллиона в сутки не должно быть проблемой
Я не знаю что делает bulk_create под капотом, возможно как раз тоже самое что я сейчас предложу Но не пробовал случайно поиграть с транзакциями?
тут можно почитать о том как сделать банч действий одной транзакцией, проверить мою теорию можно предельно быстро) https://docs.djangoproject.com/en/3.1/topics/db/transactions/
Вы atomic имеете ввиду. Я если честно, плохо понял, как оно работает. Но вроде bulk_create использует именно его. Что я ещё проверил: 1. Мой генератор, который выдаёт кол-во объектов, которое равно batch_size, жрет оперативу. С каждый циклом все больше 2. Гружу 200к позиций батчами по 5к. После перезагрузки сервера и БД отрабатывает ОК. Если второй раз запустить то оперативка сжирается и БД отключает соединение. Попробую оперативы на хостинг докинуть, может исправит ситуацию
А ведь можно было бы просто создать менеджмент команду, которая фором проходит по файлу и создаёт все что надо
да, атомик атомик оборачивает блок кода в одну транзакцию что делает bulk create -я уже скинул память может кончаться из-за мусора в памяти, у питона дерьмовый GC
" Мой генератор, который выдаёт кол-во объектов, которое равно batch_size, жрет оперативу. С каждый циклом все больше" вот над этим стоит поработать отработанные данные надо сбрасывать, конечно
Не подскажите, как это делать? Куда копать?
https://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python попробуй где это уместно
О, спасибо. Попробую
но сначала надо убедиться, что проблема в GC отработанные данные сбрасываешь так или иначе, или они висят где-то в объектах?
Нет, сам ничего не сбрасываю. Весь основной код, отвечающий у меня за процесс заполнения сбрасывал выше. Читаю csv на 1м строк, создаю датафрейм - все с помощью pandas. И потом генератором отдаю части в bulk_create. Попробую в цикл засунуть сборку мусора
"Нет, сам ничего не сбрасываю. " вот я бы озадачился удалением ненужных объектов Вполне возможно, что виноват не GC, а код, который держит в памяти лишние объекты
Обсуждают сегодня