Umgang mit einer sehr großen Anzahl von Dateien

8

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:

  1. 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.

  2. 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.

  3. 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 ...

  4. Soll ich asynchrone Programmierung verwenden oder in diesem Fall auf synchron bleiben?

Martijn 05.05.2012, 14:15
quelle

2 Antworten

1

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:

  • verbrauchen so wenig CPU wie möglich (hier hilft async / await)
  • führt mehrere Operationen gleichzeitig aus, parallel
  • steuert die Anzahl der gestarteten Aufgaben (!) - wenn Sie dies nicht berücksichtigen, werden Ihnen wahrscheinlich die Threads ausgehen, wenn Sie mit vielen Dateien arbeiten.

Sie können sich ein kleines Projekt ansehen, das ich auf GitHub veröffentlicht habe:

Paralleler Baumwanderer

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)

    
Miklós Tóth 11.10.2016 20:42
quelle
0

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.

    
blez 16.05.2012 19:55
quelle