Как стать автором
Обновить

Комментарии 3

нет никакой нужды «качать csv (и хранить локально)» чтобы его потом парсить (каждый раз при запуске). Вы можете получить поток gz, «на лету» получить поток csv из него, из него получить поток значений и получить на выходе engine-а «базу данных» в том формате, что понимает ваш engine + сохранить (например рядом) файл «db.hash» (для загрузчика) с хешем от ETag поля (которое вы просмотрели) и (если нет), то от last-modified (притом не забыть про то, что нужен результат после всех редиректов). Кроме того, я бы не стал HEAD использовать — малоли как на него будет реагировать сервер «завтра» — одного GET достаточно (с логикой расчёта хеша после заголовков и, если надо, прочитывания данных «далее»). Притом закачку можно вести в «рядом лежащий» файл, и по-успеху уведомлять движок о смене файла-базы, после чего удалять устаревшую копию…

Короче тут ещё много «всего» оптимизировать.

На с++ это выглядит как-то так (выброшен мусор типа проверок на ошибкИ):
//input  - stream байт из HTTP ответа
        std::ifstream file(input, std::ios_base::in | std::ios_base::binary);
        boost::iostreams::filtering_streambuf<boost::iostreams::input> inZ;
        inZ.push(boost::iostreams::bzip2_decompressor());
        inZ.push(file);
        std::istream in(&inZ);
Вот кстати кусок кода на Go: dev.to/flowup/using-io-reader-io-writer-in-go-to-stream-data-3i7b

Я делал недавно обработку ZIP с S3, но что-то до стриминга не дошли руки — скачивал и потом обрабатывал. Надо попробовать приведенный подход.
Согласен, мест для оптимизаций там предостаточно, но это был больше академический проект с целью посмотреть на Go, нежели претензия на законченное промышленное решение.
Что касается сохранения файла локально, то просто так было удобно для изучения и для дополнительных манипуляций с данными, например, посмотреть пакет «encoding/csv» и т.д., а перенаправить распакованный поток прямо в парсер engine, действительно, очень просто.
В процессе разработки была и закачка в «рядом лежащий» файл и создание «рядом лежащей» новой копии битмапа, но все убрал, когда увидел, как «раздувается» контейнер.
В общем, были разные варианты, но вот точно не думал про хеш файла…
Желающие заняться оптимизацией всегда найдут исходники на github, ссылка в статье.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации