2010-04-30 8 views
1

J'ai environ 1500 fichiers sur un partage pour lesquels j'ai besoin de collecter la chaîne FileVersionInfo. J'ai donc créé une méthode statique dans ma passerelle comme ceci:TPL - Utilisation de la méthode statique par rapport à la méthode struct

private static string GetVersionInfo(string filepath) 
{ 
    FileVersionInfo verInfo = FileVersionInfo.GetVersionInfo(filepath); 
    return string.Format("{0}.{1}.{2}.{3}", verInfo.ProductMajorPart, verInfo.ProductMinorPart, 
              verInfo.ProductBuildPart, verInfo.ProductPrivatePart).Trim(); 
} 

Et puis utilisé struct FileAndVersion dans un appel PLINQ avec DegreeOfParallelism que c'est d'E/S connexes

resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20) 
        .Select(r => 
        { 
         var symbolPath = r.Filename; 
         return new FilenameAndVersion{Filename=symbolPath, Version=GetVersionInfo(symbolPath)}; 
        }) 
        .ToArray(); 

Plus tard, je modifié struct, FileAndVersion comme:

private struct FilenameAndVersion 
{ 
    private string _version, _filename; 
    public string Version { get { return _version; } } 
    public string Filename { get { return _filename; } } 

    private void SetVersion() 
    { 
     FileVersionInfo verInfo = FileVersionInfo.GetVersionInfo(this.Filename); 
     this._version = string.Format("{0}.{1}.{2}.{3}", verInfo.ProductMajorPart, verInfo.ProductMinorPart, 

                        verInfo.ProductBuildPart, verInfo.ProductPrivatePart).Trim(); 
} 
public FilenameAndVersion(string filename, string version) 
{ 
    this._filename = filename; 
    this._version = string.Empty; 
    SetVersion(); 
} 

}

Et utilisé:

resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20) 
        .Select(r => 
        { 
         var symbolPath = r.Filename; 
         return new FilenameAndVersion(symbolPath, String.Empty); 
        }) 
        .ToArray(); 

La question est, cela va me aider dans toute façon et est un bon modèle à utiliser? J'ai oublié de mentionner que les fichiers se trouvent sur un serveur auquel RAID 10 avec SAN est rattaché.

Sunit

Répondre

2

Si tous vos fichiers sont sur le même disque, le faire en parallèle ne vous aidera pas du tout. Un disque ne peut lire qu'une seule chose à la fois, donc vous feriez probablement mieux d'oublier le parallélisme, de laisser tomber le surdéploiement et de le laisser tourner séquentiellement.

Tout ce que vous allez finir avec si vous exécutez cela en parallèle est un disque qui se débat peu à peu partout et finit par lire plus lentement dans l'ensemble.

Si vos fichiers se trouvent sur des disques physiques différents (ou sur un réseau tel que FTP), pensez à prendre un peu plus de contrôle sur le parallélisme et à le diviser en une seule tâche pour chaque disque physique.

Mon conseil serait de le comparer avant de vous engager fermement à faire quelque chose de parallèle.

+0

Les fichiers se trouvent sur un serveur de fichiers auquel SAN est rattaché. – Sunit

+0

@Sunit: Ce que j'ai dit pourrait être encore vrai. Votre réseau est limité, donc vous pourriez trouver que parallel vs sequential ne fait pas de différence, vous êtes toujours lié par la vitesse du réseau. La seule façon de savoir est de le comparer/le profiler. Je suppose que cela dépend probablement fortement de la charge réseau/SAN à ce moment-là, alors faites vos tests pendant les heures de pointe et hors pointe.Vous pourriez trouver que vous feriez mieux de mettre tout cela sur un seul thread de fond qui serait la plupart du temps inactif en attendant le réseau et libérer le CPU pour l'interface graphique ou d'autres travaux. –

+0

Oui, je profilais déjà en utilisant les outils VS2010. Il semble que dans notre cas, le SAN avec un réseau 10RAID/1Gb était en train de gérer donnait un meilleur résultat en utilisant TPL vs synch IO. Donc, pour l'instant, nous avons décidé d'aller dans cette direction. – Sunit

1

Utilisation du TPL (ou toute autre forme de parallélisme) lorsqu'ils traitent avec le fichier E/S est en fait plus susceptibles de ralentir l'exécution que pour l'accélérer, à moins que vous avez un moyen de garantir que les fichiers étant accédés en parallèle se trouvent sur des disques physiques différents ou sur un disque SSD. Le stockage magnétique a tendance à être beaucoup plus efficace pour les E/S séquentielles que pour les E/S à accès aléatoire (ce que vous êtes essentiellement obligé de faire ici). Mais, comme toujours, vous devez profiler et mesurer réellement l'impact du changement.

Pour clarifier: L'exécution des opérations de fichiers coûteux dans le fond (de préférence en utilisant les ports d'achèvement d'E/S, qui FileVersionInfo n'offre malheureusement pas) est une bonne chose à faire, afin de ne pas bloquer l'interface utilisateur, ou l'ASP Demande .NET, en fonction de votre environnement. C'est très différent de les exécuter dans parallèle, cependant; le TPL est principalement destiné à la parallélisation de tâches gourmandes en temps processeur, où plusieurs cœurs de processeur peuvent aider à terminer l'opération plus rapidement.

Questions connexes