我需要运行grep几百万个文件。因此,我尝试按照此处提到的两种方法加快速度:xargs -P -n和GNU parallel。我在我的文件子集(数量为 9026)上尝试了这个,结果如下:
随着xargs -P 8 -n 1000,非常快:
$ time find tex -maxdepth 1 -name "*.json" | \
xargs -P 8 -n 1000 grep -ohP "'pattern'" > /dev/null
real 0m0.085s
user 0m0.333s
sys 0m0.058s
Run Code Online (Sandbox Code Playgroud)随着parallel,非常慢:
$ time find tex -maxdepth 1 -name "*.json" | \
parallel -j 8 grep -ohP "'pattern'" > /dev/null
real 0m21.566s
user 0m22.021s
sys 0m18.505s
Run Code Online (Sandbox Code Playgroud)甚至顺序xargs比parallel: …
假设我们想使用 GNU 并行将作业分派到一组服务器。如果其中一台服务器在忙于执行作业时死机(电源故障、热关机...)会发生什么?GNU parallel 会只是将相同的作业分派到另一台服务器,还是会永远丢失该作业?
我有一个 bash 脚本,它接受三个长度相等的数组作为输入:METHODS、INFILES和OUTFILES。
该脚本将解决所有索引( ) 的METHODS[i]问题INFILES[i]并将结果保存到。OUTFILES[i]i0 <= i <= length-1
中的每个元素METHODS都是以下形式的字符串:
$HOME/program/solver -a <method>
Run Code Online (Sandbox Code Playgroud)
其中solver是一个程序,可以按如下方式调用:
$HOME/program/solver -a <method> -m <input file> -o <output file> --timeout <timeout in seconds>
该脚本并行解决所有问题,并将每个实例的运行时间限制设置为 1 小时(但有些方法可以很快解决某些问题),如下所示:
#!/bin/bash
source METHODS
source INFILES
source OUTFILES
start=`date +%s`
## Solve in PARALLEL
for index in ${!OUTFILES[*]}; do
(alg=${METHODS[$index]}
infile=${INFILES[$index]}
outfile=${OUTFILES[$index]}
${!alg} -m $infile -o $outfile --timeout 3600) &
done
wait
end=`date +%s` …Run Code Online (Sandbox Code Playgroud) 我想将 scp 文件从machineA我的文件中提取出来machineB,这就是我的做法。我被一个从复制一堆文件一个primary文件夹machineA到primary文件夹中machineB,并secondary夹machineA到secondary的文件夹machineB。
trinity@machineB:~$ scp trinity@machineA:/data01/primary/* /data01/primary/
trinity@machineB:~$ scp trinity@machineA:/data02/secondary/* /data02/secondary/
Run Code Online (Sandbox Code Playgroud)
有什么方法可以并行复制多个文件?喜欢一个文件夹中的五个文件吗?所以不是一次复制一个文件,我想分别从主文件夹或辅助文件夹中复制五个文件?
基本上我想将主要和次要文件夹中的任何内容复制machineA到machineB并行中。
如果可以使用,我的机器上也安装了 GNU Parallel。我试过下面的命令,但它不起作用。我期望它一次并行复制 5 个文件,直到从该文件夹复制所有内容。
parallel -j 5 scp trinity@machineA:/data01/primary/* /data01/primary/
Run Code Online (Sandbox Code Playgroud)
我的并行语法有什么问题吗?我可以从远程文件夹并行复制五个文件直到从中复制所有文件的最佳方法是什么?
我真正想做的是运行 X 个作业,并行运行 X 个数量以测试 API 竞争条件。
我想出了这个
echo {1..10} | xargs -n1 | parallel -m 'echo "{}"';
Run Code Online (Sandbox Code Playgroud)
哪个打印
7 8 9
10
4 5 6
1 2 3
Run Code Online (Sandbox Code Playgroud)
但我真正想看到的是(注意顺序实际上并不重要)。
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
并且这些将一次并行处理 4 个(或任何数量的 CPU/核心,我有,例如--jobs 4)。总共 10 次单独执行。
我试过这个
echo {1..10} | xargs -n1 | parallel --semaphore --block 3 -m 'echo -n "{} ";
Run Code Online (Sandbox Code Playgroud)
但它似乎只打印一次。如果您的解决方案不需要 xargs ,这似乎是对默认记录分隔符是换行符的想法的一种破解,但我也无法获得像我想要的那样工作的空间。
10 是一个相当小的数字,但可以说它要大得多, 1000
echo {1..1000} | xargs -n1 | parallel …Run Code Online (Sandbox Code Playgroud) 给定一个文件,如:
a
b
c
Run Code Online (Sandbox Code Playgroud)
我如何获得如下输出:
a 0cc175b9c0f1b6a831c399e269772661
b 92eb5ffee6ae2fec3ad71c777531578f
c 4a8a08f09d37b73795649038408b5f33
Run Code Online (Sandbox Code Playgroud)
以有效的方式?(输入为 80 GB)
我正在从美国国家公路交通安全管理局 API 中提取大约 25,000,000 个 VIN 编号的 VIN 规范。这是大量数据,因为我没有以任何方式转换数据,curl似乎是一种比 Python 更高效、更轻量级的完成任务的方式(因为 Python 的 GIL 使并行处理有点痛苦)。
在下面的代码中,vins.csv是一个包含 2500 万个 VIN 的大样本的文件,分成 100 个 VIN 的块。这些将被传递给使用 4 个内核的 GNU Parallel。一切都nhtsa_vin_data.csv在最后倾倒。
$ cat vins.csv | parallel -j10% curl -s --data "format=csv" \
--data "data={1}" https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/ \
>> /nas/BIGDATA/kemri/nhtsa_vin_data.csv
Run Code Online (Sandbox Code Playgroud)
这个过程开始时每分钟写入大约 3,000 个 VIN,随着时间的推移逐渐变慢(目前约为 1,200/分钟)。
nhtsa_vin_data.csv随着规模的增长而增加开销?>>操作的方式有关吗?每个@slm 的第一个解决方案 - 使用并行的 tmp 文件选项将每个 curl 输出写入其自己的 .par 文件,最后合并:
$ …Run Code Online (Sandbox Code Playgroud) 我从复制文件machineB和machineC成machineA,因为我跑在我下面的shell脚本machineA。
如果文件不在那里,machineB那么它machineC肯定应该在那里,所以我会先尝试复制文件machineB,如果它不在那里,machineB那么我会尝试从machineC.
我正在使用 GNU Parallel 库并行复制文件,并且工作正常。目前我正在并行复制 10 个文件。
下面是我的 shell 脚本 -
#!/bin/bash
export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary
readonly FILERS_LOCATION=(machineB machineC)
export FILERS_LOCATION_1=${FILERS_LOCATION[0]}
export FILERS_LOCATION_2=${FILERS_LOCATION[1]}
PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers
SECONDARY_PARTITION=(1643 1103 1372 1096 1369 1568) # this will have more file numbers
export dir3=/testing/snapshot/20140103
find "$PRIMARY" -mindepth 1 -delete
find "$SECONDARY" -mindepth 1 -delete
do_Copy() …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用GNU Parallel结合常量和变化的参数来多次运行comman。但由于某种原因,即使我在将常量参数传递给parallel.
在此示例中,常量参数应作为单个参数而不是两个参数'a b'传递:debug-call
$ parallel debug-call 'a b' {} ::: {1..2}
[0] = '[...]/debug-call'
[1] = 'a'
[2] = 'b'
[3] = '1'
[0] = '[...]/debug-call'
[1] = 'a'
[2] = 'b'
[3] = '2'
Run Code Online (Sandbox Code Playgroud)
debug-call是一个简单的脚本,它打印传入的每个参数argv。相反,我希望看到这个输出:
[0] = '[...]/debug-call'
[1] = 'a b'
[2] = '1'
[0] = '[...]/debug-call'
[1] = 'a b'
[2] = '2'
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是有一个选项可以阻止 GNU Parallel 在将命令行参数传递给命令之前分割它们?
我需要在远程服务器上运行本地脚本。运行脚本以并行运行很重要。
[ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt
ec2-user@18.218.191.143
ec2-user@18.220.183.27
ec2-user@18.222.199.72
ec2-user@13.58.207.76
ec2-user@18.191.231.120
[ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt | xargs -I {} ssh {} -T 'bash -s' < ./file.sh
ssh: Could not resolve hostname #!/bin/sh: Name or service not known
xargs: ssh: exited with status 255; aborting
[ec2-user@ip-172-31-43-140 ~]$
Run Code Online (Sandbox Code Playgroud) gnu-parallel ×10
parallelism ×3
bash ×2
linux ×2
scp ×2
shell-script ×2
command-line ×1
curl ×1
gnu ×1
grep ×1
hashsum ×1
quoting ×1
rsync ×1
ssh ×1
sshd ×1
stdout ×1
xargs ×1