2012-04-09 17 views
1

Ich habe 2 Millionen Dateien verteilt in Unterordnern partitioniert nach Jahren und Monaten. ich bin Looping über die Dateien verwenden:EnumerateFiles in Unterordnern Speichereffizienz

foreach (string file in Directory.EnumerateFiles(data_path, "*.*", SearchOption.AllDirectories)) 

sollte ich erwarten, dass Partitionierung der unter Verwendung eines verschachtelten Konstrukt gesetzt aufgezählten:

foreach (string year_folder in Directory.EnumerateDirectories(data_path)) 
    foreach (string month_folder in Directory.EnumerateDirectories(year_folder)) 
     foreach (string file in Directory.EnumerateFiles(month_folder)) 

würde mehr Speicher effizient sein?

Bitte beachten Sie auch meinen Kommentar unten.

+0

Ich bin wirklich scharf darauf, das Ergebnis davon zu hören, wenn Sie einen effizienteren Weg finden, dies zu tun, fügen Sie es meinem fließenden System.IO Wrapper –

+1

Sie sollten beide versuchen und herausfinden; Sie haben den Code in beiden Fällen geschrieben, also profilieren Sie einfach einen Lauf von jedem und Sie werden es sicher wissen. Selbst wenn andere theoretisieren, was besser ist, ist es ziemlich schwierig zu theoretisieren * wie viel * besser man ist. Es ist eher wahrscheinlich, dass der Unterschied so gering ist, dass er nicht besonders wichtig ist. – Servy

+0

was ich versuche zu verstehen, ist, ob der IEnumerable-Satz Speicher belegt, bis die Schleife über das letzte Element iteriert (Begründung der zweite Ansatz), oder ob Garbage Collection häufiger in der Schleife erfolgt (und dann die beiden Ansätze ähnlich sind)) – eyaler

Antwort

1

Yours ist etwas kleiner

wird Ihre vorgeschlagene Lösung leicht mehr Speicher effizient, auch wenn nur weil man die Tatsache hart codieren können, dass es genau drei Verschachtelungsebenen, dass die ersten beiden Verzeichnisse nur, und das letzte enthält nur Dateien. etwas allgemeinen

Deren

Auf der anderen Seite ist, Directory.EnumerateFiles() muss eine Lösung für den allgemeinen Fall mit beliebigem Verzeichnis Verschachtelung (die ihre eigenen internen Stapel beinhalten wird für die Verfolgung der Umsetzung, wo es in der ist Aufzählung).

Entweder man ist in Ordnung, hier sind die Vor- und Nachteile

Ihre Implementierung Ihres Codes, um Ihre aktuelle, spezifische Verzeichnisstruktur bindet. Ich bin irgendwie wie in der Lage, auf Ihre Foreach-Schleifen Blick und visualisieren, was die Ordnerstruktur ist, die es erwartet, auf der Festplatte zu finden.

Auf der anderen Seite ist das ein Ärgernis, wenn Sie oder jemand in Ihrem Team das Verzeichnislayout ändern möchten. Wenn es sehr unwahrscheinlich ist, es zu ändern, oder einfach genug, um Ihren Code zu aktualisieren, wenn Sie Ihre Verzeichnisstruktur ändern, scheint es sicher zu sein, Ihren Ansatz zu verwenden.

Verwandte Themen