2017-07-25 4 views
0

Ich versuche, eine relativ große (ca. 100k Zeilen) CSV-Datei in Python zu verarbeiten. Dies ist, was mein Code wie folgt aussieht:Wie kann ich dieses Python-Skript beschleunigen, um eine CSV-Datei zu lesen und zu verarbeiten?

#!/usr/bin/env python 

import sys 
reload(sys) 
sys.setdefaultencoding("utf8") 
import csv 
import os 

csvFileName = sys.argv[1] 


with open(csvFileName, 'r') as inputFile: 
    parsedFile = csv.DictReader(inputFile, delimiter=',') 
    totalCount = 0 
    for row in parsedFile: 
     target = row['new'] 
     source = row['old'] 
     systemLine = "some_curl_command {source}, {target}".format(source = source, target = target) 
     os.system(systemLine) 
     totalCount += 1 
     print "\nProcessed number: " + str(totalCount) 

Ich bin nicht sicher, wie dieses Skript zu optimieren. Sollte ich etwas außer DictReader benutzen?

Ich habe Python verwenden 2.7, und aktualisieren können nicht auf Python 3.

+1

Das Problem liegt nicht darin, wie Sie die CSV lesen, sondern eher, dass Sie für jede Zeile der Datei "Curl" shelling. Stattdessen: 1. Verwenden Sie nativen Python-Code zum Abrufen der URL und 2. Verwenden Sie Multithreading, um mehrere Anfragen gleichzeitig zu erstellen. – kindall

+0

Kann ich noch etwas anderes machen? Ich bin neu bei Python, und ich möchte nicht mit Multithreading herumspielen. – alexgbelov

+1

Nr. 99% der Laufzeit des Skripts ist Ihr Skript auf der Web-Anfrage, weil Sie warten auf jeden Abschluss vor dem nächsten zu starten. Um dies zu vermeiden, müssen Sie mehrere gleichzeitig ausführen. – kindall

Antwort

0
  1. Wenn Sie vermeiden möchten Multiprozessing es möglich ist, Ihre lange csv-Datei in einige kleinere CSVs zu spalten und sie gleichzeitig ausgeführt werden. Wie

    $ python your_script.py 1.csv & 
    $ python your_script.py 2.csv & 
    

Ampersand steht für die Ausführung im Hintergrund in Linux ENVs. More details here. Ich habe nicht genug Wissen über etwas ähnliches in Windows, aber es ist möglich, einige cmd Windows zu öffnen, lol.

Jedenfalls ist es viel besser zu bleiben mit multiprocessing, ofc.

  1. Wie wäre es mit requests anstelle von Curl zu verwenden?

    import requests 
    response = requests.get(source_url) 
    html = response.content 
    with open(target, "w") as file: 
        file.write(html) 
    

Here's the doc.

  1. Vermeiden print-Anweisungen, in Lauflangfristige sie höllisch langsam sind. Für die Entwicklung und das Debugging ist das in Ordnung, aber wenn Sie sich entscheiden, die endgültige Ausführung Ihres Skripts zu starten, können Sie es entfernen und die Anzahl der verarbeiteten Dateien direkt im Zielordner überprüfen.
0

subprocess.Popen(systemLine) 

statt

os.system(systemLine) 

ausgeführt wird, sollte die Dinge beschleunigen. Bitte beachten Sie, dass systemLine eine Liste von Zeichenfolgen sein muss, um [some_curl_command ',' source ',' target '] zu funktionieren. Wenn Sie die Anzahl der gleichzeitigen Befehle begrenzen möchten, werfen Sie einen Blick auf that.

Verwandte Themen