Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix命令的并行执行?_Unix_Gnu Parallel - Fatal编程技术网

Unix命令的并行执行?

Unix命令的并行执行?,unix,gnu-parallel,Unix,Gnu Parallel,我编写了一个shell程序,使用csplit自动将文件分成4部分,然后编写了四个shell程序,在后台使用nohup执行相同的命令,一个while循环将查找这四个过程的完成情况,最后是cat output1.txt…output4.txt>finaloutput.txt 但后来我知道了这个命令并行,我尝试了这个大文件,但看起来它并没有像预期的那样工作。此文件是以下命令的输出- for i in $(seq 1 1000000);do cat /etc/passwd >> data.t

我编写了一个shell程序,使用csplit自动将文件分成4部分,然后编写了四个shell程序,在后台使用nohup执行相同的命令,一个while循环将查找这四个过程的完成情况,最后是cat output1.txt…output4.txt>finaloutput.txt

但后来我知道了这个命令并行,我尝试了这个大文件,但看起来它并没有像预期的那样工作。此文件是以下命令的输出-

for i in $(seq 1 1000000);do cat /etc/passwd >> data.txt1;done

time wc -l data.txt1
10000000 data.txt1

real    0m0.507s
user    0m0.080s
sys     0m0.424s
平行

time cat data.txt1 | parallel  --pipe wc -l | awk '{s+=$1} END {print s}'
10000000

real    0m41.984s
user    0m1.122s
sys     0m36.251s
当我尝试使用2GB文件~1000万条记录时,花了20多分钟

此命令是否仅适用于多核系统我当前使用的是单核系统

nproc --all
1

简言之,是的。。您需要在机器上安装更多的物理内核,才能从并行中获益。只是为了理解你的任务;下面是你打算做的

file1 is a 10,000,000 line file

split into 4 files > 
file1.1  > processing > output1
file1.2  > processing > output2
file1.3  > processing > output3
file1.4  > processing > output4

>> cat output* > output 
________________________________
你想把中间部分并行化,在4个核上运行,希望能同时在4个核上运行。我说得对吗?我认为您可以更好地使用GNU并行,为其中一个文件编写代码,并将该命令与psuedocode警告一起使用

parallel --jobs 4 "processing code on the file segments with sequence variable {}"  ::: 1 2 3 4 
其中-j表示处理器的数量

更新 为什么要在文件1.1.2 1.3和1.4中尝试并行命令顺序执行??让它成为您所编码的常规顺序处理

parallel 'for i in $(seq 1 250000);do cat file1.{} >> output{}.txt;done' ::: 1 2 3 4 
上面的代码将在4个内核上并行运行csplit中的4个分段文件

for i in $(seq 1 250000);do cat file1.1 >> output1.txt;done
for i in $(seq 1 250000);do cat file1.2 >> output2.txt;done
for i in $(seq 1 250000);do cat file1.3 >> output3.txt;done
for i in $(seq 1 250000);do cat file1.4 >> output4.txt;done

我非常确信,上面Ole建议的-diskpart是更好的方法;鉴于您可以从HDD进行高速数据访问

简言之,是的。。您需要在机器上安装更多的物理内核,才能从并行中获益。只是为了理解你的任务;下面是你打算做的

file1 is a 10,000,000 line file

split into 4 files > 
file1.1  > processing > output1
file1.2  > processing > output2
file1.3  > processing > output3
file1.4  > processing > output4

>> cat output* > output 
________________________________
你想把中间部分并行化,在4个核上运行,希望能同时在4个核上运行。我说得对吗?我认为您可以更好地使用GNU并行,为其中一个文件编写代码,并将该命令与psuedocode警告一起使用

parallel --jobs 4 "processing code on the file segments with sequence variable {}"  ::: 1 2 3 4 
其中-j表示处理器的数量

更新 为什么要在文件1.1.2 1.3和1.4中尝试并行命令顺序执行??让它成为您所编码的常规顺序处理

parallel 'for i in $(seq 1 250000);do cat file1.{} >> output{}.txt;done' ::: 1 2 3 4 
上面的代码将在4个内核上并行运行csplit中的4个分段文件

for i in $(seq 1 250000);do cat file1.1 >> output1.txt;done
for i in $(seq 1 250000);do cat file1.2 >> output2.txt;done
for i in $(seq 1 250000);do cat file1.3 >> output3.txt;done
for i in $(seq 1 250000);do cat file1.4 >> output4.txt;done
我非常确信,上面Ole建议的-diskpart是更好的方法;鉴于您可以从HDD进行高速数据访问

-管道效率很低,但不是您正在测量的比例-您的系统出现了严重问题。它的总传输速率为1 GB/s

-相反,pipepart是高效的。只要您的磁盘足够快,它可以提供每核1 GB/s的速度。这应该是处理数据最有效的方法。txt1。它将把data.txt1拆分为每个cpu内核的一个块,并将这些块提供给在每个内核上运行的wc-l:

parallel  --block -1 --pipepart -a data.txt1 wc -l
您需要版本20161222或更高版本才能使用block-1

这些是我的旧双核笔记本电脑的计时。seq 200000000生成1.8 GB的数据

$ time seq 200000000 | LANG=C wc -c
1888888898

real    0m7.072s
user    0m3.612s
sys     0m2.444s

$ time seq 200000000 | parallel --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898

real    1m28.101s
user    0m25.892s
sys     0m40.672s
这里的时间主要是由于GNU并行为每个1MB块生成一个新的wc-c。增加块大小可以加快速度:

$ time seq 200000000 | parallel --block 10m --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898

real    0m26.269s
user    0m8.988s
sys     0m11.920s

$ time seq 200000000 | parallel --block 30m --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898

real    0m21.628s
user    0m7.636s
sys     0m9.516s
如前所述-如果文件中有数据,则pipepart的速度要快得多:

$ seq 200000000 > data.txt1
$ time parallel --block -1 --pipepart -a data.txt1 LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898

real    0m2.242s
user    0m0.424s
sys     0m2.880s
因此,在我的旧笔记本电脑上,我可以在2.2秒内处理1.8 GB的数据

如果您只有一个内核,并且您的工作依赖于CPU,那么并行化对您没有帮助。如果大部分时间都花在等待(例如等待网络)上,那么在单核机器上进行并行化是有意义的

然而,从你的计算机计时告诉我,这是非常错误的。我建议您在另一台计算机上测试您的程序。

-pipe效率很低,但不是您正在测量的比例-您的系统出现了严重错误。它的总传输速率为1 GB/s

-相反,pipepart是高效的。只要您的磁盘足够快,它可以提供每核1 GB/s的速度。这应该是处理数据最有效的方法。txt1。它将把data.txt1拆分为每个cpu内核的一个块,并将这些块提供给在每个内核上运行的wc-l:

parallel  --block -1 --pipepart -a data.txt1 wc -l
您需要版本20161222或更高版本才能使用block-1

这些是我的旧双核笔记本电脑的计时。seq 200000000生成1.8 GB的数据

$ time seq 200000000 | LANG=C wc -c
1888888898

real    0m7.072s
user    0m3.612s
sys     0m2.444s

$ time seq 200000000 | parallel --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898

real    1m28.101s
user    0m25.892s
sys     0m40.672s
这里的时间主要是由于GNU并行为每个1MB块生成一个新的wc-c。增加块大小可以加快速度:

$ time seq 200000000 | parallel --block 10m --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898

real    0m26.269s
user    0m8.988s
sys     0m11.920s

$ time seq 200000000 | parallel --block 30m --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898

real    0m21.628s
user    0m7.636s
sys     0m9.516s
如前所述-如果文件中有数据,则pipepart的速度要快得多:

$ seq 200000000 > data.txt1
$ time parallel --block -1 --pipepart -a data.txt1 LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898

real    0m2.242s
user    0m0.424s
sys     0m2.880s
因此,在我的旧笔记本电脑上,我可以在2.2秒内处理1.8 GB的数据

如果您只有一个内核,并且您的工作依赖于CPU,那么并行化对您没有帮助。如果大部分时间都花在等待(例如等待网络)上,那么在单核机器上进行并行化是有意义的

然而,从你的计算机计时告诉我,这是非常错误的。我将推荐
请在另一台计算机上测试您的程序。

我尝试了您的命令,但它不起作用,它抛出错误没有文件或目录时间cat数据。txt1 | parallel-jobs 4 wc-l | awk'{s+=$1}END{print s}但是下面的命令工作正常,但需要更多时间cat数据。txt1 | parallel-pipe wc l-l | awk'{s+=$1}END{print s}“另一个瓶颈可能是硬盘的读取速度。如果您在常规HDD上启动4个线程,则没有raid,速度也会变慢。顺便问一下,为什么要将cat data.txt1并行传输。您可以创建第一个文件1.1.2 1.3和1.4。完成后,在所有4个文件上同时创建并行运行,并获得输出1..2..3..4。。。等待该过程完成。然后连接输出。我猜你使用parallel是完全错误的。我尝试了你的命令,但它不工作,它抛出错误没有文件或目录时间cat数据。txt1 | parallel-jobs 4 wc-l | awk'{s+=$1}END{print s}但是下面的命令工作正常,但它需要更多的时间cat数据。txt1 | parallel-pipe wc l-l | awk'{s+=$1}END{print s}“另一个瓶颈可能是硬盘的读取速度。如果您在常规HDD上启动4个线程,则没有raid,速度也会变慢。顺便问一下,为什么要将cat data.txt1并行传输。您可以创建第一个文件1.1.2 1.3和1.4。完成后,在所有4个文件上同时创建并行运行,并获得输出1..2..3..4。。。等待该过程完成。然后连接输出。我猜你用的平行词全错了。我是作者。您应该在您的计算机和另一台计算机上尝试下面我显示的测试。我想你的电脑不知怎么坏了。我是作者。您应该在您的计算机和另一台计算机上尝试下面我显示的测试。我想你的电脑不知怎么坏了。