【发布时间】:2013-12-01 03:37:36
【问题描述】:
Awk 逐行处理文件。假设每条线路操作不依赖于其他线路,有没有办法让 awk 一次并行处理多条线路? 是否有任何其他文本处理工具可以自动利用并行性并更快地处理数据?
【问题讨论】:
标签: awk batch-processing
Awk 逐行处理文件。假设每条线路操作不依赖于其他线路,有没有办法让 awk 一次并行处理多条线路? 是否有任何其他文本处理工具可以自动利用并行性并更快地处理数据?
【问题讨论】:
标签: awk batch-processing
尝试提供 awk 并行实现的唯一 awk 实现是 parallel-awk,但现在看来该项目已死。
否则,并行化 awk 的一种方法是将输入分成块并并行处理它们。但是,拆分输入数据仍然是单线程的,因此可能会破坏性能增强目标,主要问题是标准 split 命令无法在不读取每一行的情况下在行边界处拆分。
如果您有可用的 GNU 拆分,或支持 -n l/* 选项的版本,这里是并行处理文件的一种优化方法,假设这里有 8 个 vCPU:
inputfile=input.txt
outputfile=output.txt
script=script.awk
count=8
split -n l/$count $inputfile /tmp/_pawk$$
for file in /tmp/_pawk$$*; do
awk -f script.awk $file > ${file}.out &
done
wait
cat /tmp/_pawk$$*.out > $outputfile
rm /tmp/_pawk$$*
【讨论】:
您可以为此使用GNU Parallel
假设您正在计算一个大文件中数字的总和:
cat rands20M.txt | awk '{s+=$1} END {print s}'
使用 GNU Parallel,您可以在多个线程中完成:
cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' | awk '{s+=$1} END {print s}'
【讨论】:
cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' 吗?你真的需要将并行 awk 传递给 ~same 命令吗?