【问题标题】:Passing multiple parameters to python in GNU parallel在 GNU 并行中将多个参数传递给 python
【发布时间】:2016-12-06 22:30:34
【问题描述】:

我有完美运行的代码,但我想使用 GNU 并行并使其运行得更快。 代码读入一个每行都有一个 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 --pipepart -a json.in --block 1M python json_parser.py

但是如何传递另外两个参数 DB_order 和 transaction 呢?

谢谢

【问题讨论】:

    标签: python parameters gnu-parallel


    【解决方案1】:

    --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 计算为文件大小/作业槽,并为每个作业分配一个块。好处:更少的工作创业。缺点:如果一个块慢得多,它可能会减慢一切。比如说,如果一个块的处理时间是其他块的两倍,那么总运行时间将是其他块的两倍。

    --block 1M--roundrobin 之间的折衷方案是省略 --block。这将使 GNU Parallel 计算 --block 作为文件大小/(10*jobslots) 导致每个作业槽有 10 个作业。如果一个块需要两倍于其他块,那么运行时间只会延长 10%。

    【讨论】:

    • 非常感谢您构建 GNU 并行并花时间回答问题!
    猜你喜欢
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2014-10-22
    • 2018-06-29
    • 1970-01-01
    相关资源
    最近更新 更多