170 похожих чатов

Добрый день, подскажите пожалуйста! Вторую неделю бьюсь с загрузкой 1М

строк в БД. Вот основные момент кода: https://codeshare.io/2KVX6X

пытаюсь сделать bulk_create с указанием batch_size, но исхода два: 1. Если большой батч сайз, то заканчивается оперативка и БД вылетает с ошибкой 2. Если батч сайз слишком маленький, то улетает куча запросов в БД + заполнение происходит долго.

Может ли быть проблема в том, что каждая строка, которую я хочу добавить, имеет связанный ForeignKey? Как можно исправить ситуацию?(

22 ответов

23 просмотра
Vlad-Naumov Автор вопроса

Ну неужели никто миллион записей в БД не вносил?)

за раз это долго, и зависит от размера записей и еще разных параметров

Vlad-Naumov Автор вопроса

Да пусть хоть 5, хоть 10 минут грузится. Как правильно это сделать?

ну зависит от того как нужно это делать, для джанги есть иморт \ экспорт либы, а еще можно написать менеджмент команду и запускать с указанием файла - типа python manage.py import_data filename если база sqlite то будет очень долгая вставка, если создаются индексы сразу то будет очень долго тоже, зависит от полей конечно) для интовых не сильно как для текстовых

Я по 50к в одном queryset грузил, все было ок.

К одному миллиону имеется ввиду

На postgresql

> Если батч сайз слишком маленький, то улетает куча запросов в БД + заполнение происходит долго так запустили бы и я за 2 недели явно загрузилось

Vlad-Naumov Автор вопроса

Только мне надо 3 раза в день обновлять))

ну записать 3миллиона в сутки не должно быть проблемой

Я не знаю что делает bulk_create под капотом, возможно как раз тоже самое что я сейчас предложу Но не пробовал случайно поиграть с транзакциями?

тут можно почитать о том как сделать банч действий одной транзакцией, проверить мою теорию можно предельно быстро) https://docs.djangoproject.com/en/3.1/topics/db/transactions/

Vlad-Naumov Автор вопроса

Вы atomic имеете ввиду. Я если честно, плохо понял, как оно работает. Но вроде bulk_create использует именно его. Что я ещё проверил: 1. Мой генератор, который выдаёт кол-во объектов, которое равно batch_size, жрет оперативу. С каждый циклом все больше 2. Гружу 200к позиций батчами по 5к. После перезагрузки сервера и БД отрабатывает ОК. Если второй раз запустить то оперативка сжирается и БД отключает соединение. Попробую оперативы на хостинг докинуть, может исправит ситуацию

А ведь можно было бы просто создать менеджмент команду, которая фором проходит по файлу и создаёт все что надо

да, атомик атомик оборачивает блок кода в одну транзакцию что делает bulk create -я уже скинул память может кончаться из-за мусора в памяти, у питона дерьмовый GC

" Мой генератор, который выдаёт кол-во объектов, которое равно batch_size, жрет оперативу. С каждый циклом все больше" вот над этим стоит поработать отработанные данные надо сбрасывать, конечно

Vlad-Naumov Автор вопроса

Не подскажите, как это делать? Куда копать?

https://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python попробуй где это уместно

Vlad-Naumov Автор вопроса

О, спасибо. Попробую

но сначала надо убедиться, что проблема в GC отработанные данные сбрасываешь так или иначе, или они висят где-то в объектах?

Vlad-Naumov Автор вопроса

Нет, сам ничего не сбрасываю. Весь основной код, отвечающий у меня за процесс заполнения сбрасывал выше. Читаю csv на 1м строк, создаю датафрейм - все с помощью pandas. И потом генератором отдаю части в bulk_create. Попробую в цикл засунуть сборку мусора

"Нет, сам ничего не сбрасываю. " вот я бы озадачился удалением ненужных объектов Вполне возможно, что виноват не GC, а код, который держит в памяти лишние объекты

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта