Я загружаю довольно гигантский файл в базу данных postgresql. Для этого я сначала использую split
файл, чтобы получить файлы меньшего размера (30 ГБ каждый), а затем загружаю каждый файл меньшего размера в базу данных, используя GNU Parallel
и psql copy
.
Проблема в том, что для разделения файла требуется около 7 часов, а затем он начинает загружать файл на ядро. Мне нужен способ заставить split
имя файла выводить на вывод std каждый раз, когда он заканчивает запись файла, поэтому я могу передать его по конвейеру, Parallel
и он начинает загружать файлы в тот момент, когда он split
заканчивает писать. Что-то вроде этого:
split -l 50000000 2011.psv carga/2011_ | parallel ./carga_postgres.sh {}
Я прочитал split
справочные страницы и ничего не могу найти. Есть ли способ сделать это с помощью split
какого-либо другого инструмента?
источник
Почему бы не использовать --pipe AND --pipepart с GNU Parallel? Это устраняет лишнюю кошку и запускает прямое чтение из файла на диске:
источник
Я нашел ответы, размещенные здесь, чтобы быть сложным, поэтому я спросил о переполнении стека, и я получил этот ответ:
Если вы используете
GNU split
, вы можете сделать это с--filter
опциейВы можете создать скрипт оболочки, который создаст файл и запустить carga_postgres.sh в конце в фоновом режиме.
и использовать этот скрипт в качестве фильтра
источник
Альтернативой
split
печати имен файлов является определение того, когда файлы готовы. В Linux вы можете использовать средство inotify и, в частности,inotifywait
утилиту.Вам нужно будет убить
inotifywait
вручную. Убить его автоматически немного сложно, потому что есть потенциальное состояние гонки: если вы убьете его, как толькоsplit
закончите, возможно, он получил события, о которых он еще не сообщил. Чтобы убедиться, что все события сообщаются, подсчитайте соответствующие файлы.источник