Поставили мне задачку сделать сервис устаревших паспортов. Просто REST которому кидаешь JSON содержащий серию и номер паспорта, а в ответ приходит Passed или Failed. Сама база недействительных паспортов общедоступна. Её можно скачать с сайта МВД по адресу https://guvm.mvd.ru/upload/expired-passports/list_of_expired_passports.csv.bz2. Беда только в том, что в разархивированном виде она занимает почти 1.5 гигабайта, и её необходимо регулярно обновлять. Хочется грузить её максимально быстро, поэтому первое, что приходит в голову, это загрузить её с помощью команды COPY https://www.postgresql.org/docs/9.3/static/sql-copy.html
План обновлений изначально был такой:
1. Загружаем и разархивируем свежий файл
2. Чистим (TRUNCATE) табличку с паспортами
3. Копируем (COPY) CSV-файл прямо в эту табличку
4. Подчищаем ненужные файлы.
5. Радуемся результату.
Вроде просто и понятно, но возникает проблемка. Копирование 1.5 гигабайтного файла происходит небыстро и в одну транзакцию. То есть пока идет копирование, все запросы будут идти в пустую таблицу. Это, прямо скажем, не то, что хотелось. Для решения этой проблемы возникла идея вместо прямых запросов в таблицу использовать представление, которое будет смотреть в уже заранее загруженную таблицу. План получился такой:
1. Загружаем и разархивируем свежий файл
2. Создаём таблицу под новую версию
3. Копируем (COPY) CSV-файл в свежесрезанную табличку
4. Обновляем представление, чтобы оно смотрело на загруженную таблицу
5. Удаляем (DROP) старую таблицу
6. Подчищаем больше ненужные файлы.
7. Радуемся результату.
Локально, на мощном железе разработчика, сработало отлично. Запускаем всё это дело в Kubernetes и пытаемся загрузить базу. Ждем, ждём, ждём... Прождал 4 часа и печально ушел домой. В момент ухода БД съела уже 6 Гб ОЗУ. Все-таки загрузка таких больших файлов за раз на маленькой БД оказалась плохой идеей. Видимо, эта тема хорошо работает только для небольших файлов или больших баз. Пришлось отказаться от COPY и переделать на загрузку пачками по 10000 штук. В результате загрузка паспортов прошла в разумное время.
Вот какие ИТ приключения.
Комментариев нет:
Отправить комментарий