2016-06-05 9 views
2

Ich habe eine Klasse erstellt, die eine Datei durchläuft und nachdem sie überprüft hat, ob eine Zeile gültig ist, schreibt sie diese Zeile in eine andere Datei. Jede Zeile, die es überprüft, ist ein langwieriger Prozess, der es sehr langsam macht. Ich muss Threading/Multiprocessing in der Funktion process_file implementieren; Ich weiß nicht, welche Bibliothek am besten geeignet ist, um diese Funktion zu beschleunigen oder zu implementieren.Python: Wie gehe ich mehrere Zeilen gleichzeitig in einer Datei durch?

class FileProcessor: 
    def process_file(self): 
     with open('file.txt', 'r') as f: 
      with open('outfile.txt', 'w') as output: 
       for line in f: 
        # There's some string manipulation code here... 
        validate = FileProcessor.do_stuff(self, line) 
        # If true write line to output.txt 
    def do_stuff(self, line) 
     # Does stuff... 
     pass 

Zusätzliche Informationen: Der Code einer Proxy-Liste geht durch Prüfen, ob er online ist. Dies ist ein langwieriger und zeitraubender Prozess.

Vielen Dank für einen Einblick oder Hilfe!

+0

Sie könnten [mmap] (https://docs.python.org/2/library/mmap.html) verwenden, um die Datei effizienter zu lesen, alle Ihre Validierung durchzuführen und dann Ihre Schreibvorgänge in die Ausgabedatei auszuführen. Hast du das probiert? –

+0

Ist der Titel der Frage irreführend? Ich denke, dass Sie nach Möglichkeiten suchen, die Dateiverarbeitung parallel zu machen, weil IO in Ihrem Fall schneller als die Berechnung ist (haben Sie das bestätigt?). – Jasper

+0

Tut mir leid, ich glaube, ich habe mich nicht gut genug erklärt. Mein Problem ist, dass der Code eine Zeile Code betrachtet, einige Dinge mit dieser Zeile tut und die Zeile in eine Funktion setzt, die true oder false zurückgibt und dann mit der nächsten Zeile wiederholt, usw. Ich versuche es zu bekommen, so dass es mehrere Zeilen gleichzeitig durchläuft. – Taylor

Antwort

1

Der Code geht über eine Proxy-Liste überprüft, ob er online ist

Es klingt wie das, was dauert eine lange Zeit mit dem Internet verbindet, was bedeutet, Ihre Aufgabe IO gebunden ist und somit Fäden Geschwindigkeit helfen es auf. Mehrere Prozesse sind immer anwendbar, können jedoch schwieriger zu verwenden sein.

+0

Ja, es ist eine Verbindung zum Internet, die die ganze Zeit dauert. Ich kann einen Thread nicht so implementieren, dass er mehrere Zeilen gleichzeitig durchläuft und überprüft, ob dieser Proxy verfügbar ist. – Taylor

+0

@ Taylor müssen Sie mehrere Threads starten, die alle den gleichen Code ausführen. Sie sollten wahrscheinlich vermeiden, dass alle auf die gleichen Dateien zugreifen. –

+0

Ich brauche die Threads, um auf die gleichen Dateien zuzugreifen. Wäre es nicht ohnehin möglich, darauf zuzugreifen? – Taylor

0

Dies scheint ein Job für multiprocessing.map.

import multiprocessing 

def process_file(filename): 
    pool = multiprocessing.Pool(4) 
    with open(filename) as fd: 
     results = pool.imap_unordered(do_stuff, (line for line in fd)) 
     with open("output.txt", "w") as fd: 
      for r in results: 
       fd.write(r) 

def do_stuff(item): 
    return "I did something with %s\n" % item 

process_file(__file__) 

Sie können auch multiprocessing.dummy.Pool stattdessen verwenden, wenn Sie möchten Threads verwenden (die in diesem Fall vorzuziehen sein könnte, da Ihre I/O-bound).

Im Wesentlichen übergeben Sie ein iterable zu imap_unordered (oder imap, wenn die Bestellung wichtig ist) und Austeilen von Teilen davon zu anderen Prozessen (oder Threads, wenn Dummy verwenden). Sie können die chunksize der Karte optimieren, um die Effizienz zu verbessern. Wenn Sie dies in eine Klasse einkapseln möchten, müssen Sie multiprocessing.dummy verwenden. (Andernfalls kann die Instanzmethode nicht verwendet werden.)

Sie müssen warten, bis die Karte fertig ist, bevor Sie die Ergebnisse verarbeiten können, obwohl Sie stattdessen die Ergebnisse in do_stuff schreiben könnten - nur sicher sein, die Datei zu öffnen im Append-Modus, und Sie werden wahrscheinlich lock the file wollen.

Verwandte Themen