[英]Using GNU Parallel With Split
我正在将一个巨大的文件加载到PostgreSQL数据库中。 为此,我首先在文件中使用split
获取较小的文件(每个30Gb),然后使用GNU Parallel
和psql copy
每个较小的文件加载到数据库中。
问题在于,拆分文件大约需要7个小时,然后每个内核才开始加载文件。 我需要的是一种告诉split
在每次完成文件写入时将文件名打印到std输出的方法,因此我可以将其管道传输到Parallel
并在split
完成写入时开始加载文件。 像这样:
split -l 50000000 2011.psv carga/2011_ | parallel ./carga_postgres.sh {}
我已经阅读了split
手册页,但找不到任何内容。 有没有办法使用split
工具或任何其他工具来做到这一点?
您可以让parallel进行拆分:
<2011.psv parallel --pipe -N 50000000 ./carga_postgres.sh
请注意,该手册页建议使用--block
over -N
,这仍将在记录分隔符处拆分输入,默认情况下为\\n
,例如:
<2011.psv parallel --pipe --block 250M ./carga_postgres.sh
--pipe
和-N
这是将100个数字的序列分成5个文件的测试:
seq 100 | parallel --pipe -N23 'cat > /tmp/parallel_test_{#}'
检查结果:
wc -l /tmp/parallel_test_[1-5]
输出:
23 /tmp/parallel_test_1
23 /tmp/parallel_test_2
23 /tmp/parallel_test_3
23 /tmp/parallel_test_4
8 /tmp/parallel_test_5
100 total
如果使用GNU split
,则可以使用--filter
选项
'--filter =命令'
使用此选项,而不是简单地写入每个输出文件,而是通过管道将管道写入每个输出文件的指定shell命令。 命令应使用$ FILE环境变量,该变量在每次调用命令时都设置为不同的输出文件名。
您可以创建一个shell脚本,该脚本创建一个文件并在后台的末尾启动carga_postgres.sh
#! /bin/sh
cat >$FILE
./carga_postgres.sh $FILE &
并使用该脚本作为过滤器
split -l 50000000 --filter=./filter.sh 2011.psv
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.