【发布时间】:2019-03-23 12:21:37
【问题描述】:
我正在运行一个 awk 脚本,我想通过 GNU 并行进行并行化。
此脚本根据每一行的值将一个输入文件多路分解为多个输出文件。代码如下:
#!/usr/bin/awk -f
BEGIN{ FS=OFS="\t" }
{
# bc is the field that defines to which file the line
# will be written
bc = $1
# append line to such file
print >> (bc".txt")
}
我想通过以下方式使用 GNU 并行化它:
parallel --line-buffer --block 1G --pipe 'awk script.awk'
但是,我担心两个 awk 进程同时在同一个文件中写入可能出现的竞争条件。是否有可能,如果可以,如何在不影响并行化的情况下避免这种情况?
注意。我包含了--line-buffer 选项,尽管我不确定它是否也适用于 awk 脚本中的文件重定向。它是否也适用于这种情况或仅适用于每个 awk 进程的标准输出?
示例
# Input file
bc1 line1
bc3 line2
bc1 line3
bc2 line4
# Output file bc1.txt
bc1 line1
bc1 line3
# Output file bc2.txt
bc2 line4
# Output file bc3.txt
bc3 line2
【问题讨论】:
-
摆脱所有缓冲是很棘手的。让每个进程写入单独的文件并在之后将它们连接起来更安全。
-
如果这是可能的,我会感到惊讶。但也许你需要告诉我们为什么你认为你需要并行化它。只需让
awk运行一次,然后按照您在此处显示的内容进行编写。但是,如果您打开的文件超过*N*,则每次写入后都必须关闭。 (其中 N 是操作系统允许进程打开的文件数)。祝你好运! -
@karakfa 我现在正在测试的解决方案正是这样做的 - 但由于它需要更多操作,我想知道是否有现成的解决方案。
-
@shellter 关于打开文件数的好点。我需要并行化它,因为我有一个非常大的文件,我想将它拆分成块,因为单核 awk 目前是这里的瓶颈。
标签: bash file awk io-redirection gnu-parallel