2013-01-17 8 views
5

Po prostu kilka porad Mam 100.000+ xml pliku do przetworzenia i przenieść się do innego systemu.Przetwarzanie plików za pomocą ParallelForeach. Czy to jest najlepsze podejście?

Koncepcja jest dość prosta mam pętlę jak:

public void ProcessFiles() 
    { 
     IEnumerable<FileInfo> orderedFiles = GetFilesOrdered(); 

     foreach (FileInfo file in orderedFiles) 
     { 
      ProcessFile(file); 
     } 
    } 

Czytałem o Task Parallel biblioteki, ale nie tak pewny siebie. Nie jest to bardzo przyklejone do gwintowania. Wygląda na to, że TPL zawija wiele dla mnie.

Mówiąc prościej jest to tylko przypadek użycia parallel.Foreach?

każda próbka lub sugestie

+0

Witam, Dla bezpieczeństwa wątku, Lepiej upewnić się, że żaden z tych plików nie będzie dostępny jednocześnie. –

+0

@ Joe.wang Dzięki, masz na myśli dodanie blokady? jeśli nie, możesz podać mi fragment kodu, dzięki za twój czas. – user9969

+0

Do czego służy zmienna 'index'? Wydaje się, że go nie używasz. – Bridge

Odpowiedz

0

Tak, to może być tak proste, jak zastąpienie foreach z Parallel.ForEach.

Należy pamiętać, że wiele wątków jednocześnie wykonywałoby ProcessFile.

Tak więc, jeśli piszesz do dowolnego stanu współdzielonego w tej metodzie, będziesz musiał użyć konstrukcji synchronizacji, aby go chronić.

Jeśli jesteś nowym wielowątkowości, istnieje wielki ebook wprowadzający należy przeczytać tutaj: Albahari

+4

Jeszcze jedna myśl: dodanie tu równoległości ma sens tylko wtedy, gdy IO nie jest obecnie wąskim gardłem –

+0

@NicholasButler, w jaki sposób unikasz wyścigu z biblioteką równoległą? używasz blokady – user9969

+0

@ user231465 To ogromny temat. Proponuję przeczytać ebooka Joe Albahari. Będziesz musiał zrozumieć wszystko, jeśli zamierzasz poprawnie pisać współbieżny kod. –

0

nadzieję, że to pomocne dla Ciebie. Prosty fragment do pokazania, jak przesuwać plik równolegle.

 List<FileInfo> files = new List<FileInfo>(); 
     files.Add(new FileInfo("F:\\1.xml")); 
     files.Add(new FileInfo("F:\\2.xml")); 
     files.Add(new FileInfo("F:\\3.xml")); 



     Parallel.ForEach(files, f => 
     { 
      f.MoveTo("d:\\test\\" + f.Name); 
     }); 
Powiązane problemy