並行化 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
的原始行號。你應該注意到第二列(以及檔案的其餘部分)中的順序是保持不變的。