2013-02-14 2 views
0

J'essaie d'optimiser un programme de sauvegarde que j'ai créé. Le code est bâclé parce que c'est mon premier programme de cette ampleur, mais j'espère que vous pouvez regarder plus loin.en utilisant Parallel.ForEach

Ce programme fonctionne correctement, mais il semble prendre plus de temps que nécessaire. Donc, je suis en train de jouer avec le Parallel.ForEach pour aider à optimiser le processus de compression.

En ce moment, je dois le programme faire passer comme un éclair la tâche de la façon suivante

Dim Destin = JobNode.SelectNodes("Destination") 

For Each item As System.Xml.XmlNode In Destin 
    Dim time As DateTime = DateTime.Now 
    Dim format As String = "MMMddyyyy" 
    Dim zpath As String = item.InnerText 
    'replaces [date] in destination with actual Date 
    If time.DayOfWeek = 1 Then 
     time = time.AddDays(-1) 
     item.InnerText = Replace(item.InnerText, "[date]", time.ToString(format) & "_WE") 
     zpath = item.InnerText 
     zip.ParallelDeflateThreshold = -1 
     zip.Save(zpath) 
    Else 
     Dim time1 As DateTime = DateTime.Now.AddDays(-1) 
     item.InnerText = Replace(item.InnerText, "[date]", time1.ToString(format)) 
     zpath = item.InnerText 
     zip.ParallelDeflateThreshold = -1 
     zip.Save(zpath) 
    End If 
Next 

je tous les emplacements de source et de destination enregistrées dans un fichier xml pour la lecture. Et cela pour chaque boucle fonctionne exactement comme je le veux. Cependant, j'ai du mal à convertir ceci Pour chaque boucle dans une boucle Parallel.ForEach.

Toute aide serait bien. Encore une fois, je suis toujours vert quand il s'agit de programmer, alors c'est idiot pour moi.

Et oui ... J'ai cherché de l'aide sur Internet mais cela me trouble, ne fonctionne pas dans mon contexte, ou je n'arrive pas à l'utiliser avec mon code.

+0

Pourquoi pensez-vous qu'il prend plus de temps que nécessaire? Il y a de fortes chances que votre programme soit limité par la vitesse du lecteur de disque. Si vous utilisez Windows 7 (je ne sais pas sur Vista ou Windows 8), vous pouvez utiliser Resource Monitor, disponible dans l'onglet Performance du Gestionnaire des tâches (appuyez sur ctrl + shift + esc), pour voir ce qui se passe. sur. Dans l'onglet Vue d'ensemble, regardez les diagrammes CPU et Disque sur la droite. –

+0

Eh bien je suppose que je ne sais pas à coup sûr si c'est complètement optimal. Je pense juste que le fait d'avoir chaque travail étant zippé sur un fil séparé DEVRAIT accélérer certains. Zipper chaque travail en même temps doit faire gagner du temps ... juste? – MaylorTaylor

+0

Pas nécessairement: si le lecteur de disque doit déplacer la tête d'avant en arrière à plus d'endroits alors vous pourriez le ralentir en faisant des fichiers compressés en parallèle. Les tests révéleront si c'est le cas. Rappelez-vous qu'il doit déplacer la tête pour lire à partir du fichier source, puis le déplacer à nouveau pour écrire dans le fichier de destination. –

Répondre

0

Essayez ceci:

Dim Destin = JobNode.SelectNodes("Destination").OfType(Of XmlNode) 

    Dim format As String = "MMMddyyyy" 
    Parallel.ForEach(Destin, 
     Sub(item) 
     Dim time As DateTime = DateTime.Now.AddDays(-1) 
     Dim zpath As String = item.InnerText 
     'replaces [date] in destination with actual Date 
     Dim timeString = If(time.DayOfWeek = 1, time.ToString(format) & "_WE", time.ToString(format)) 
     item.InnerText = Replace(item.InnerText, "[date]", timeString) 
     zpath = item.InnerText 
     zip.ParallelDeflateThreshold = -1 
     zip.Save(zpath) 
     End Sub) 
+0

* AmbiguousMatchException non gérée * La résolution de surcharge a échoué car aucun 'ForEach' public ne peut être appelé avec ces arguments: 'Fonction publique partagée ForEach (de TSource) (source As OrderablePartitioner (de TSource), corps As Action (de TSource, ParallelLoopState , Long)) As System.Threading.Tasks.ParallelLoopResult ': L'argument type d'inférence échoue pour l'argument correspondant au paramètre' source '. L'argument type d'inférence échoue pour l'argument correspondant au paramètre 'body'. – MaylorTaylor

+1

Quel est le type de JobNode? SelectNodes renvoie-t-il un IEnumerable (Of T) ou juste IEnumerable? Vous devrez peut-être forcer la frappe en utilisant .OfType (Of x) lorsque vous déclarez Destin. –

+0

Pour chaque JobNode dans JobNodes .... est l'endroit où j'appelle JobNode. Et JobNodes est appelé par "Dim JobNodes comme XmlNodeList = doc.getelementbytagname (" Job ") – MaylorTaylor

Questions connexes