繁体   English   中英

结合使用GNU Parallel和Split

[英]Using GNU Parallel With Split

我正在将一个巨大的文件加载到PostgreSQL数据库中。 为此,我首先在文件中使用split获取较小的文件(每个30Gb),然后使用GNU Parallelpsql 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM