Pull to refresh

Comments 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Мб так, что каждый чанк будет примерно одинакового размера, но при этом нет опасений, что какой-либо фрагмент будет начинаться с середины строки или заканчиваться не в конце.
Sign up to leave a comment.

Articles