2010-07-08 18 views
7

Ich habe eine große Anzahl von (> 100k) relativ kleinen Dateien (1kb - 300kb), die ich einlesen und verarbeiten muss. Ich laufe gerade durch alle Dateien und benutze File.ReadAllText, um den Inhalt zu lesen, ihn zu verarbeiten und dann die nächste Datei zu lesen. Das ist ziemlich langsam und ich frage mich, ob es eine gute Möglichkeit gibt, es zu optimieren.Eine große Anzahl von Dateien schnell lesen

Ich habe bereits versucht, mehrere Threads zu verwenden, aber da dies IO-gebunden scheint, habe ich keine Verbesserungen gesehen.

+0

Welcher Teil dauert am längsten? Dateien laden oder bearbeiten? –

+0

@NickLarsen: Laden der Dateien. – Tim

+0

Auch wenn das Laden am längsten dauert, kann Multithreading immer noch einen Gewinn bringen, da es zumindest den Verarbeitungsaspekt von der Gesamtlaufzeit (den meisten) entfernen kann. –

Antwort

7

Sie sind wahrscheinlich richtig - Lesen, dass viele Dateien wahrscheinlich Ihre potenziellen Beschleunigungen begrenzen werden, da die Disk I/O der begrenzende Faktor sein wird.

Das gesagt, Sie können sehr wahrscheinlich eine kleine Verbesserung tun, indem Sie die Verarbeitung der Daten in einen separaten Thread übergeben.

Ich würde empfehlen, einen einzelnen "Produzenten" -Thread zu haben, der Ihre Dateien liest. Dieser Thread wird IO-limitiert sein. Während es eine Datei liest, kann es die "Verarbeitung" in einen ThreadPool-Thread (.NET 4-Tasks funktioniert auch dafür) schieben, um die Verarbeitung durchzuführen, wodurch es sofort die nächste Datei lesen könnte.

Dies wird mindestens die "Bearbeitungszeit" aus der Gesamtlaufzeit herausnehmen, was die Gesamtzeit für Ihren Job fast so schnell macht wie das Disk IO, vorausgesetzt, Sie haben einen oder zwei zusätzliche Kerne.

+0

lol Nur was ich gesagt habe. Große Köpfe denken ähnlich – Icemanind

2

Was ich tun würde, ist die Verarbeitung in einem separaten Thread. Ich würde in einer Datei lesen und die Daten in der Warteschlange speichern, dann die nächste Datei einlesen und so weiter.

Lassen Sie in Ihrem zweiten Thread die Daten aus dieser Warteschlange lesen und verarbeiten Sie sie. Schau, ob das hilft!

0

Wahrscheinlich ist die Zeit für die Laufwerksuche der limitierende Faktor (dies ist einer der häufigsten Engpässe beim Ausführen von Make, der normalerweise viele kleine Dateien enthält). Dumb-Dateisystem-Designs haben einen Verzeichniseintrag und bestehen auf einem Zeiger auf die Plattenblöcke für eine Datei, und das garantiert mindestens 1 Suche pro Datei.

Wenn Sie Windows verwenden, würde ich wechseln NTFS zu verwenden (die kleine Dateien in den Verzeichniseintrag speichert (-.> Speichern eine Platte pro Datei suchen) Wir verwenden eine Disk-Komprimierung auch (mehr Rechen aber CPUs sind billig und schnell, aber weniger Speicherplatz -> weniger Lesezeit); dies ist möglicherweise nicht relevant, wenn Ihre Dateien alle klein sind. Es kann ein Linux-Dateisystem geben, wenn Sie dort sind.

Ja , sollten Sie eine Reihe von Threads starten, um die Dateien zu lesen:

Sie müssen dies möglicherweise drosseln, um ru zu verhindern Es werden keine Threads ausgegeben, aber ich würde auf Hunderte, nicht auf 2 oder 3, schießen. Wenn Sie das tun, sagen Sie dem Betriebssystem, dass es viele Stellen auf der Festplatte lesen kann, und es kann mehrere Anfragen nach Festplattenplatzierung anfordern (elevator algorithm), und das wird auch helfen, Kopfbewegung zu minimieren.

0

Ich würde "MultiThreading" empfehlen, um dieses Problem zu lösen. Als ich deine Post-Antworten gelesen habe, habe ich plötzlich festgestellt, dass Reed Copseys Antwort so produktiv sein wird. Sie können eine Probe für diese Lösung finden, die von Elmue auf dieser link vorbereitet wurde. Ich hoffe, dass dies nützlich sein kann und dank Reed Copsey. Mit freundlichen Grüßen

0

Ich stimme den Kommentaren von Reed und Icemanind zu. Ziehen Sie außerdem in Betracht, wie Sie die Festplatten-IO erhöhen können.Verteilen Sie die Dateien beispielsweise auf mehrere Festplatten, damit sie parallel gelesen werden können, und verwenden Sie schnellere Festplatten wie SSDs oder eine RAM-Disk.

Verwandte Themen