かなり大きなファイルをpostgresqlデータベースにロードしています。これを行うには、最初にsplit
ファイルを使用して小さなファイル(それぞれ30 Gb)を取得し、各GNU Parallel
小さなファイルをデータベースにロードするために使用しましたpsql copy
。
問題は、ファイルを分割した後、コアごとに1つのファイルをロードし始めるのに約7時間かかります。私にとって必要なのは、ファイルの書き込みが終わるたびにファイル名をstd出力に印刷して、書き込みが終わったらパイプしてsplit
ファイルParallel
のロードを開始できるようにする方法です。split
このような:
split -l 50000000 2011.psv carga/2011_ | parallel ./carga_postgres.sh {}
split
マニュアルページを読みましたが、何も見つかりません。split
他のツールや他のツールを使用してこれを行う方法はありますか?
ベストアンサー1
--pipelineを使用してください:
cat 2011.psv | parallel --pipe -l 50000000 ./carga_postgres.sh
ファイルではなく標準入力から読み取るには ./carga_postgres.sh が必要で、GNU パラレルバージョン < 20130222 では速度が遅い
正確に50000000行を必要としない場合は、--blockが高速です。
cat 2011.psv | parallel --pipe --block 500M ./carga_postgres.sh
これにより、約 500 MB の分割チャンクが \n 渡されます。
./carga_postgres.shには何が含まれているのかわかりませんが、ユーザー名とパスワードを含むpsqlが含まれているようです。この場合、GNU SQL(GNU Parallelの一部)を使用できます。
cat 2011.psv | parallel --pipe --block 500M sql pg://user:pass@host/db
主な利点は、一時ファイルを保存する必要はありませんが、すべてのファイルをメモリ/パイプラインに保存できることです。
./carga_postgres.sh が標準入力から読み取れないがファイルから読み取る必要がある場合は、ファイルに保存できます。
cat 2011.psv | parallel --pipe --block 500M "cat > {#}; ./carga_postgres.sh {#}"
大規模な雇用はしばしば途中にあります。 GNU Parallel は失敗したタスクを再実行することで助けることができます。
cat 2011.psv | parallel --pipe --block 500M --joblog my_log --resume-failed "cat > {#}; ./carga_postgres.sh {#}"
失敗した場合は、上記のコマンドを再実行できます。正常に処理されたブロックはスキップされます。