2016-12-06 4 views
0

Ich habe Code, der perfekt funktioniert, aber ich möchte GNU parallel verwenden und es schneller laufen lassen. Der Code liest eine Datei mit einem JSON in jeder Zeile ein, analysiert sie und erstellt eine weitere Zeile.Mehrere Parameter an Python in GNU parallel übergeben

Input (json.in)

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

Output

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

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

Python-Code wird wie folgt:

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) 

ich den Code auszuführen, wie

python json_parser.py json.in DB_order transaction 
folgt

Meine Frage ist, wie konvertiere ich dies in GNU parallele Syntax.

ich in der Lage bin, um es nur in GNU parallel amke arbeitet nach Dateinamen wie folgt übergeben:

parallel --pipepart -a json.in --block 1M Python json_parser.py

Aber wie gebe ich die anderen beiden Parameter DB_order und transaction?

Dank

Antwort

0

--fifo ist sehr effizient:

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

Ich bemerke nicht -k verwenden, so nehme ich an, in welcher Reihenfolge spielt keine Rolle Fall dies in der Regel schneller ist:

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

Er berechnet --block als Dateigröße/Jobschlitze und gibt jedem Job einen Block. Der Vorteil: Weniger Job-Startups. Der Nachteil: Wenn ein Block viel langsamer ist, kann es alles verlangsamen. Angenommen, ein Block benötigt doppelt so viel Zeit wie die anderen, wird die gesamte Laufzeit doppelt so lang sein.

Ein Kompromiss zwischen --block 1M und --roundrobin ist --block weglassen. Dies macht GNU Parallel compute als Dateigröße/(10 * jobslots), was zu 10 Jobs pro Jobslot führt. Wenn ein Block doppelt so lange dauert wie der Rest, ist die Laufzeit nur 10% länger.

+0

Ole danke für den Aufbau von GNU parallel und nehmen Sie sich Zeit, um Fragen zu beantworten! – user3646519

Verwandte Themen