Ich arbeite derzeit an einem Forschungsprojekt, bei dem eine große Anzahl von Dateien indexiert wird (240k); Sie sind meist HTML, XML, doc, xls, zip, rar, pdf und Text mit Dateigrößen von ein paar KB bis zu mehr als 100 MB.
Mit den extrahierten Zip- und Rar-Dateien erhalte ich insgesamt eine Million Dateien.
Ich verwende Visual Studio 2010, C # und .NET 4.0 mit Unterstützung für TPL Dataflow und Async CTP V3. Um den Text aus diesen Dateien zu extrahieren benutze ich Apache Tika (konvertiert mit ikvm) und verwende Lucene.net 2.9.4 als Indexer. Ich möchte die neue TPL-Datenflussbibliothek und die asynchrone Programmierung verwenden.
Ich habe ein paar Fragen:
Würde ich Leistungsvorteile erhalten, wenn ich TPL verwende? Es ist hauptsächlich ein I / O-Prozess und von dem, was ich verstehe, bietet TPL nicht viel Nutzen, wenn Sie stark I / O verwenden.
Wäre ein Hersteller / Verbraucher-Ansatz der beste Weg, um mit dieser Art von Dateiverarbeitung umzugehen, oder gibt es andere Modelle, die besser sind? Ich dachte daran, einen Hersteller mit mehreren Konsumenten zu schaffen, indem er blockierende Sammlungen verwendet.
Würde die TPL-Datenflussbibliothek für diesen Prozesstyp von Nutzen sein? Es scheint, dass TPL Dataflow am besten in einer Art von Messaging-System verwendet wird ...
Soll ich asynchrone Programmierung verwenden oder in diesem Fall auf synchron bleiben?
async / await hilft definitiv beim Umgang mit externen Ressourcen - in der Regel Web-Anfragen, Dateisystem- oder db-Operationen. Das interessante Problem hier ist, dass Sie mehrere Anforderungen gleichzeitig erfüllen müssen:
Sie können sich ein kleines Projekt ansehen, das ich auf GitHub veröffentlicht habe:
Es kann beliebig viele Dateien in einer Verzeichnisstruktur effizient aufzählen. Sie können die asynchrone Operation für jede Datei definieren (in Ihrem Fall indizieren), während Sie gleichzeitig die maximale Anzahl von Dateien steuern, die gleichzeitig verarbeitet werden.
Zum Beispiel:
%Vor%(Wenn Sie das Tool nicht direkt als DLL verwenden können, finden Sie möglicherweise noch einige nützliche Beispiele im Quellcode)
Sie können die Everything-Suche verwenden. Das SDK ist Open Source und hat ein C # -Beispiel. Es ist der schnellste Weg, Dateien unter Windows zu indexieren.
Von FAQ :
1.2 Wie lange dauert das Indizieren meiner Dateien?
"Alles" verwendet nur Datei- und Ordnernamen und dauert in der Regel ein paar Sekunden, um das & gt; Datenbank. Eine Neuinstallation von Windows XP SP2 (ca. 20.000 Dateien) benötigt etwa 1 Sekunde zum Indexieren. 1.000.000 Dateien benötigen ca. 1 Minute.
Ich bin mir nicht sicher, ob Sie TPL damit verwenden können.
Tags und Links c# task-parallel-library file-io tpl-dataflow async-ctp