並行化 STDIN

現在,讓我們假設我們有一個需要逐行轉換的大檔案(例如 30 GB)。假設我們有一個指令碼 convert.sh,就是這個 <task>。我們可以將這個檔案的內容管道傳輸到 stdin 並行接收和工作在諸如的

<stdin> | parallel --pipe --block <block size> -k <task> > output.txt

<stdin> 可以來自 cat <file> 等任何東西。

作為一個可重複的例子,我們的任務將是 nl -n rz。拿任何檔案,我的將是 data.bz2,然後傳遞給 <stdin>

bzcat data.bz2 | nl | parallel --pipe --block 10M -k nl -n rz | gzip > ouptput.gz

上面的例子從 bzcat data.bz2 | nl 獲取 <stdin>,其中我將 nl 作為概念證明,最終輸出 output.gz 將按照收到的順序儲存。然後,parallel<stdin> 劃分為大小為 10 MB 的塊,並且對於每個塊,它將它傳遞給 nl -n rz,在那裡它只是附加一個正確對齊的數字(有關詳細資訊,請參閱 nl --help)。選項 --pipe 告訴 parallel<stdin> 分成多個作業,-- block 指定塊的大小。選項 -k 指定必須保持排序。

你的最終輸出應該是這樣的

000001       1  <data>
000002       2  <data>
000003       3  <data>
000004       4  <data>
000005       5  <data>
 ... 
000587  552409  <data>
000588  552410  <data>
000589  552411  <data>
000590  552412  <data>
000591  552413  <data>

我的原始檔案有 552,413 行。第一列表示並行作業,第二列表示以塊的形式傳遞給 parallel 的原始行號。你應該注意到第二列(以及檔案的其餘部分)中的順序是保持不變的。