2016-03-02 64 views
3

我有一個文本文件(Input.txt),其中包含domains,總計約爲35 Millions domains在Bash/Shell中並行處理的高效方法?

#Input.txt 
google.com 
cnn.com 
bbc.com 
........ 

現在,我有一個python腳本來檢查每個狀態代碼,並在文本文件(INPUT.TXT)相關的所有領域。對於較小的一套,我做

for i in $(cat Input.txt);do python status_check.py $i;done > out_file.txt 

如果我以這種方式處理,這可能需要年齡檢查的狀態代碼,所有35個萬個域名。

我並不熟悉並行處理。有人可以幫助我,如何通過使用shell/bash/any節省時間來完成任務?

+0

[並行bash腳本處理命令(可能的重複http://stackoverflow.com/questions/19543139/bash-script-處理命令並行) – tworec

+2

首先,你爲什麼要在地球上這樣做?其次,改變你的Python腳本,以便它可以在一次調用中處理多個域。最後,用'GNU Parallel'像這樣運行:'parallel -m -a Input.txt python status_check.py' –

回答

3

您正在尋找GNU並行:

cat Input.txt | parallel -j 100 python status_check.py > out_file.txt 

GNU並行是一個普遍的並行化,使容易在同一臺機器上或你有ssh訪問多臺機器上運行並行作業。它通常可以代替for循環。

如果你想在4個CPU上運行32個不同的工作崗位,並行化直接的方式是在每個CPU上運行8個作業:

Simple scheduling

GNU並行,而不是產生一個新的進程時,一個完成 - 保持CPU的活躍,從而節省了時間:

GNU Parallel scheduling

安裝

如果您的發行版沒有打包GNU Parallel,則可以執行個人安裝,但不需要root訪問權限。它可以在10秒內通過這樣來完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

對於其他安裝選項見http://git.savannah.gnu.org/cgit/parallel.git/tree/README

瞭解更多

查看更多的例子:http://www.gnu.org/software/parallel/man.html

觀看介紹視頻: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

走過t他教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

訂閱郵件列表,以獲得支持:https://lists.gnu.org/mailman/listinfo/parallel

2

把一個符號您的$ 1日後,它會運行每一個「同時」

擊可能不是這樣做合適的工具。每個叉子在資源方面都非常昂貴。你最好使用Ruby或Python,將它讀入一個數組,然後在解釋器的VM中處理它。

+0

不知道分叉3500萬個進程是多麼明智...... –

+0

我完全同意! – TheFiddlerWins

1

爲什麼不改變你的Python腳本來讀取URL本身,然後分發處理?

當你可以在python中這樣做的時候,看起來有點沒有意義的有bash for-loop。

python中有很多模塊用於處理並行處理listed here