2016-12-06 22 views
0

我有完美的代碼,但我想使用GNU並行和運行速度更快。 代碼讀入每行都有JSON的文件,解析它並創建一行。將多個參數傳遞給Python中的GNU並行

輸入(json.in)

{"NBR": "8001474830", "UNIQUE_ID": "PP007.8001474830.20150807"} 

輸出

{"create": {"_type": "transaction", "_id":"PP007.8001474830.20150807.8001474830", "_index": "DB_order"}} 

{"NBR": "8001474830:, "UNIQUE_ID": "PP007.8001474830.20150807"} 

的Python代碼如下:

import sys 
import json 
import fileinput 

index = ""+sys.argv[2]+"" 
type = ""+sys.argv[3]+"" 


create_bulk={ "create": { "_index": index, "_type": type, "_id": "0"}} 

for line in fileinput.input(sys.argv[1]): 
     json_in=json.loads(line) 
     create_bulk["create"]["_id"]=json_in["UNIQUE_ID"]+"."+json_in["NBR"] 
     print json.dumps(create_bulk) 
     print json.dumps(json_in) 

我執行的代碼如下

python json_parser.py json.in DB_order transaction 

我的問題是如何將其轉換爲GNU並行語法。

我能夠amke只是通過將文件名這樣它GNU並行工作:

平行--pipepart -a json.in --block 1M蟒蛇json_parser.py

但是,我如何傳遞另外兩個參數DB_order和transaction?

感謝

回答

0

--fifo是非常有效的:

parallel --pipepart --fifo -a json.in --block 1M python json_parser.py {} my_DB_order my_transaction 

我注意到你不使用-k,所以我假設的順序並不重要在這種情況下,這是典型的速度更快:

parallel --round-robin --pipepart --fifo -a json.in python json_parser.py {} DB_ordera transactiona 

它計算​​作爲文件大小/ jobslots並給每個作業一個塊。好處:減少就業創業。缺點:如果一個街區慢得多,它可能會放慢一切。比如說,如果一個塊需要兩倍的時間來處理其他塊,那麼總運行時間將會增加兩倍。

--block 1M--roundrobin之間的折衷是省略​​。這將使得GNU並行計算​​爲文件大小/(10 * jobslots),從而導致每個工作區10個作業。如果一個塊的剩餘時間是兩倍,那麼運行時間只會延長10%。

+0

Ole感謝您構建GNU並行並花時間回答問題! – user3646519

相關問題