如何成批处理我的数据文件(不使用应用程序并行)?

如何成批处理我的数据文件(不使用应用程序并行)?

我有一个分析程序和一个包含数据的文本文件,为了便于说明,我将分别调用wibbledata.txt

我尝试了一个简单的for循环来处理我的所有数据:

for i in $(cat data.txt);做
    摆动 $i
完毕

但一一分析完却需要很长的时间。

所以我尝试让它为每个数据分拆单独的工作:

for i in $(cat data.txt);做
    (摆动 $i )&
完毕

但是运行如此多的分析进程会导致内存崩溃!

所以我想以五人为一组来启动分析过程。我想获取前五个数据项,对这些数据项启动分析过程;然后取接下来的五个并做同样的事情;等等。

我怎样才能做到这一点,而不使用程序“并行”,如之前的帖子(如下)所述?我在我的机构工作站上没有 sudo 权限来安装此应用程序,因此我尝试使用更简单的代码来实现此目标。

https://unix.stackexchange.com/questions/299346/running-commands-at-once
https://unix.stackexchange.com/questions/361505/how-to-control-for-loop

答案1

使用 GNU xargs

xargs -rn 1 -P 5 -a file wibble

这会在arrall中运行最多 5 个wibble命令,每个命令从as 参数中获取 1 个单词。Pfile

对于 GNU 来说,xargs单词由空格、制表符或换行符序列分隔,并且单引号、双引号和反斜杠被识别为这些分隔符以及彼此之间的引用运算符。

为了在文件的每一行添加一个-d '\n'.

为了要像在 on 的方法中一样对待bash,默认情况下(除非被修改)它们$IFS在空格、制表符和换行符上分隔,并且还受文件名生成的影响,您可以执行以下操作:

xargs -rn 1 -P 5 -0a <(printf '%s\0' $(<file)) wibble

也就是说,让 shell 执行 split+glob 并将printf结果单词传递给xargs.

相关内容