我有三种格式不同的数据。对于每种数据类型,都有一个Python脚本将其转换为统一的格式。
该Python脚本运行缓慢且受CPU限制(连接到多核计算机上的单个核),因此我想运行该脚本的三个实例(每种数据类型一个),并将其输出组合到中sort
。基本上,等效于:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
但是,三个脚本并行运行。
我发现了一个问题,其中使用GNU split
在处理该流的脚本的n个实例之间循环一些stdout流。
在拆分手册页中:
-n, --number=CHUNKS
generate CHUNKS output files. See below
CHUNKS may be:
N split into N files based on size of input
K/N output Kth of N to stdout
l/N split into N files without splitting lines
l/K/N output Kth of N to stdout without splitting lines
r/N like 'l' but use round robin distributio
因此,该r/N
命令表示“ 不分割线 ”。
基于此,以下解决方案似乎应该是可行的:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
这在哪里choose_script
:
#!/bin/bash
{ read x; ./handle_$x.py; }
不幸的是,我看到了一些行的混合-以及许多不应该出现的换行符。
例如,如果我用执行此操作的一些简单bash脚本替换了我的Python脚本:
#!/bin/bash
# ./handle_1.sh
while true; echo "1-$RANDOM"; done;
。
#!/bin/bash
# ./handle_2.sh
while true; echo "2-$RANDOM"; done;
。
#!/bin/bash
# ./handle_3.sh
while true; echo "3-$RANDOM"; done;
我看到以下输出:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
这很烦人-根据我上面粘贴的手册页摘要,它应该保持行的完整性。
显然,如果我删除该-u
参数,它会起作用,但随后会对其进行缓冲,并且会耗尽内存,因为它会缓冲除一个脚本之外的所有脚本的输出。
如果有人在这里有什么见识,将不胜感激。我不在这里。
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
吗?
coproc
bash 中的内置函数,尽管我并没有真正看到它如何应用。