2016-05-23 9 views
1

Ich habe eine Datei, die XML-Elemente in jeder Zeile enthält, die in JSON konvertiert werden muss. Ich habe ein Python-Skript geschrieben, das die Konvertierung durchführt, aber im seriellen Modus läuft. Ich habe zwei Möglichkeiten, Hadoop oder GNU Parallel zu verwenden, ich habe Hadoop ausprobiert und möchte sehen, wie GNU helfen kann, wird sicher einfach sein.GNU Parallel zum Ausführen von Python-Skript auf große Datei

Mein Python-Code ist wie folgt:

import sys import json import xmltodict with open('/path/sample.xml') as fd: for line in fd: o=xmltodict.parse(line) t=json.dumps(o) with open('sample.json', 'a') as out: out.write(t+ "\n") So kann ich GNU parallel verwenden, um direkt auf der riesigen Datei zu arbeiten, oder muss ich es teilen müssen?

Oder ist dies der richtige: cat sample.xml | parallel python xmltojson.py >sample.json

Dank

Antwort

1

Sie benötigen eine Python-Code auf einem UNIX-Filter, das heißt ein Programm, das von der Standardeingabe (stdin) und schreibt auf die Standardausgabe (stdout liest sich ändern). Ungeprüfte:

import fileinput 
import sys 
import json 
import xmltodict 

for line in fileinput.input(): 
     o=xmltodict.parse(line) 
     t=json.dumps(o) 
     print t + "\n" 

Dann nutzen Sie --pipepart in GNU Parallel:

parallel --pipepart -a sample.xml --block 1M python my_script.py 

1M so einstellen, (number_of_cpu * 10) < (total_size/Blockgröße) < (number_of_cpu * 100). Dies sollte ein vernünftiges Gleichgewicht zwischen dem Beginn neuer Arbeitsplätze und dem Warten auf den Abschluss alter Arbeitsplätze schaffen.

+0

Bis 10k, Ole! –

+1

Ole, dass die Zeit von 59 Minuten auf 15 Sekunden reduziert !! – user3646519