Bry*_*mas 4 parallel-processing gnu
我正在使用GNU Parallel在文件的每一行上同时执行命令。尽管它不会对结果造成任何问题,但 GNU 并行会发出许多以下类型的警告,使输出变得混乱:
parallel: Warning: A full record was not matched in a block. Increasing to --blocksize 1363150
我认为这只是意味着我选择使用的块大小在输入边界处不太匹配,因此并行正在增加块大小,所以它确实如此。正如我所说,我不认为这会对输出结果造成任何问题,这只是我需要一遍又一遍地重复看到的警告,甚至一次。有什么办法可以专门抑制这些警告吗?我真的不想完全重定向 stderr 并错过任何重要消息。
你的假设是错误的。GNU Parallel 告诉您的是,它已读取完整的块,而您的记录无法容纳该大小。所以增加尺寸。GNU Parallel 告诉您“--blocksize 1363150”就足够了,但您可能希望将其进一步增加到“--block 3M”。
如果将“--blocksize”设置为至少最大记录大小的 2 倍,您将永远不会看到警告。
从技术上讲,GNU Parallel 会读取一个完整的块(在本例中假设为 7 个字节)并将其附加到其缓冲区中。它尝试在其缓冲区中查找完整记录(在本例中我们假设为完整行)。如果不能,它会向您发出警告,以指数方式(缓慢)增加块大小并重试:
输入数据:
12345\n
123456\n
1234567\n
12345678\n
123456789\n
1234567890\n
Run Code Online (Sandbox Code Playgroud)
GNU Parallel 一次读取 7 个字节:
12345\n
1
Run Code Online (Sandbox Code Playgroud)
缓冲区包含一整行,所以一切都很好。
23456\n
1
Run Code Online (Sandbox Code Playgroud)
缓冲区包含一整行,所以一切都很好。
234567
Run Code Online (Sandbox Code Playgroud)
缓冲区不包含整行,因此您会收到警告,并且 --blocksize 增加到 8:
\n
1234567
Run Code Online (Sandbox Code Playgroud)
缓冲区现在包含一整行,所以一切都很好。
8\n
123456
Run Code Online (Sandbox Code Playgroud)
缓冲区包含一整行,所以一切都很好。
789\n
1234
Run Code Online (Sandbox Code Playgroud)
缓冲区包含一整行,所以一切都很好。
567890\n
Run Code Online (Sandbox Code Playgroud)
缓冲区包含一整行,所以一切都很好。