在GNU并行

时间:2016-12-06 22:30:34

标签: python parameters gnu-parallel

我有完美的代码,但我想使用GNU parallel adn让它运行得更快。 代码读入一个文件,每行都有一个JSON,解析它并再创建一行。

输入(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并行语法。

我能够通过传递文件名这样在GNU parallel中工作:

  

parallel --ppartpart -a json.in --block 1M python json_parser.py

但是如何传递其他两个参数DB_order和transaction?

由于

1 个答案:

答案 0 :(得分: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

它将--block计算为filesize / jobslots,并为每个作业提供一个块。好处:创业机会减少。缺点:如果一个区块慢得多,它可能会减慢一切。比方说,如果一个块需要两倍的时间来处理,那么总运行时间将是两倍。

--block 1M--roundrobin之间的妥协是遗漏--block。这将使GNU Parallel compute --block成为filesize /(10 * jobslots),每个作业槽产生10个作业。如果一个块占用剩余的两倍,那么运行时间只会延长10%。