2012-03-30 9 views
2

ich eine sehr einfach Parallel.ForEach haben, dass der folgende Code ruft:C# Threading Parallel.ForEach und Directory Out of Memory Exception

var maxDegree = new ParallelOptions{MaxDegreeOfParallelism = 5}; 
Parallel.ForEach(PList,maxDegree,fl => 
      { 
       ProjectDirectoryProcessing pjp = new ProjectDirectoryProcessing(); 
       pjp.ProjectProcessor(fl); 
       Console.ReadLine(); 
      } 
     ); 

public class ProjectDirectoryProcessing 
{ 

    public void ProjectProcessor(string rootDirectory) 
    { 
      DirectoryInfo Dinfo = new DirectoryInfo(rootDirectory); 
      DirectoryInfo[] directories = Dinfo.GetDirectories("*.*", SearchOption.AllDirectories); 
      FileInfo[] finfo = Dinfo.GetFiles("*.*", SearchOption.AllDirectories); 
      foreach (FileInfo f in finfo) 
      { 
       FileSize = FileSize + f.Length; 
      } 
      FileCount = finfo.Length; 
      DirectoryCount = directories.Length; 
    } 
} 

Das Problem ist, ich über genügend Arbeitsspeicher ausgeführt, dachte ich über GC.Collect() nach dem pjp.ProjectProcessor in der Parallel.ForEach, aber ich bin mir nicht sicher, ob dies funktioniert. Die Verzeichnisse sind extrem groß und ich bin nicht davon überzeugt, dass das Aufräumen viel hilft. Was wäre ein guter Weg, damit umzugehen?

+0

Es hängt davon ab, was Sie mit den Dateien tun müssen. 'Directory.EnumerateFiles' könnte einen großen Unterschied machen. –

+0

siehe bearbeiten, ich zähle nur die Größe der Verzeichnisse und der Dateianzahl, und Directory.EnumerateFiles verursacht ein großes Leistungsproblem –

+0

Was genau soll Ihre Anwendung tun? Können Sie nicht zu einem Producer-Consumer-Modell wechseln und Ordner einzeln laden? – Tudor

Antwort

0

Das manuelle Aufrufen von GC hilft nicht, da GC vor dem Auslösen einer OutOfMemoryException automatisch aufgerufen werden sollte. Eine einfache Lösung könnte sein, die Anwendung als x64 zu kompilieren. Ist das eine Option?

+0

Derzeit nicht, ich könnte eine Testbox anfordern und geben Sie einen Schuss, wird das helfen, so viel? –

+1

Sicher. Ich habe mit riesigen Anwendungen gearbeitet, die nicht auf einen x32-Adressraum passen konnten, der auf x64 einwandfrei funktionierte. Ihnen fehlt nicht wirklich der Speicher, sondern der Adressraum. –

+0

Heres das ist nicht 4 GB, 4 GB? Egal, ob es 32 oder 64 Bit ist, ich dachte, der Punkt von 64 Bit wäre der Zugriff auf größere Speicherauslastung –

Verwandte Themen