Комментарии 2
Круто!
Но сразу замечания по докеру:
docker run --name pg -d -e "POSTGRES_USER=my_user" -e "POSTGRES_PASSWORD=my_password" postgres
так не будет никакой возможности подсоединиться к БД снаружи, а цепляться по внутреннему айпи адресу контейнера — ну, такое себе… Можно сразу нарезать нужные пробросы портов или засунуть контейнеры в нужные докер-сети для внутренней коммуникации. В принципе, была пара коллег, которым наглядные примеры этого не помешали
По SQL — почему не используется подстановка аргументов на уровне SQL, а они жестко вшиваются format'ом в строчку на уровне самого python?
По CSV — сорри, у меня уже глаз замылен. Поэтому два вопроса — как сделана сериализации записи в файл (т.е., если в лоб писать в несколько процессов — они могут писать вразнобой, в результате — файл будет содержать записи вперемешку, и что хуже — сами записи будут разбиты) и как чтение — потому что чтение по границе 5МБ может повредить (разорвать) одну строчку CSV
Можно сразу нарезать нужные пробросы портов или засунуть контейнеры в нужные докер-сети для внутренней коммуникацииСоглашусь с комментарием, однако, в статье основная мысль — реализация алгоритма сверки данных и лично мне было не сложно прописать ip-адрес в конфиге, запустив перед этим:
docker inspect pg
Docker network здесь выглядит оверхедом.
По SQL — почему не используется подстановка аргументов на уровне SQL, а они жестко вшиваются format'ом в строчку на уровне самого python?Вы имеете в виду передачу имени объектов (схемы и таблицы) в качестве параметров курсору? Если да, то так делать не рекомендуется документацией psycopg
если в лоб писать в несколько процессов — они могут писать вразнобой, в результате — файл будет содержать записи вперемешку, и что хуже — сами записи будут разбиты) и как чтение — потому что чтение по границе 5МБ может повредить (разорвать) одну строчку CSVЭтот кусок кода должен помочь понять как реализовано чтение файла:
with open(self.file_name_raw, 'rb') as file:
chunk_end = file.tell()
while True:
chunk_start = chunk_end
file.seek(size, 1)
file.readline()
Тут одна хитрость, мы смещаемся при помощи seek(size, 1) на 5 мегабайт относительно текущей позиции, но readline() дочитывает до конца строки для избежания «поломки». Т.е. всегда генератором chunkify перед процессом чтения разбивается файл по ~5Мб так, что каждый чанк будет примерно одинакового размера, но при этом нет опасений, что какой-либо фрагмент будет начинаться с середины строки или заканчиваться не в конце.
Multiprocessing и реконсиляция данных из различных источников