Combinez plusieurs fichiers en un seul fichier

Code:

static void MultipleFilesToSingleFile(string dirPath, string filePattern, string destFile)
{
    string[] fileAry = Directory.GetFiles(dirPath, filePattern);

    Console.WriteLine("Total File Count : " + fileAry.Length);

    using (TextWriter tw = new StreamWriter(destFile, true))
    {
        foreach (string filePath in fileAry)
        {
            using (TextReader tr = new StreamReader(filePath))
            {
                tw.WriteLine(tr.ReadToEnd());
                tr.Close();
                tr.Dispose();
            }
            Console.WriteLine("File Processed : " + filePath);
        }

        tw.Close();
        tw.Dispose();
    }
}

J'ai besoin pour optimiser ce qu'elle est extrêmement lente: prend 3 minutes pour 45 fichiers de taille moyenne de 40 — 50 Mo fichier XML.

Veuillez noter: 45 fichiers d'une moyenne de 45 MO est juste un exemple, il peut être n nombre de fichiers de m la taille, où n est en milliers & m peut-être de la moyenne de 128 Ko. En bref, il peut varier.

Pourriez-vous nous apporter des points de vue sur l'optimisation?

  • Avez-vous besoin d'attendre cette méthode fait? Si pas, essayez de async
  • 45 fichiers d'une moyenne de 45 MO chacun soit un total d'un peu plus de 2 GO. Combien de temps pensez-vous que prendre? Disk I/O sera prise en compte pour une grande partie du temps, c'est prenant.
  • L'appel de Dispose est superflu, comme les objets que vous êtes l'élimination sont déjà à l'aide du bloc (qui prendra soin de Disposer pour vous).
  • Vous êtes en train de charger dans la mémoire de chaque fichier. Ces grandes chaînes d'aller dans le grand tas d'objets, pourquoi ne pas vous lire les petits morceaux de données (réutilisation de la mémoire tampon)? Fermer/Débarrasser sont inutiles en raison de l'utilisation de déclaration. Un raw Flux est assez parce que vous n'avez pas à gérer/modifier n'importe quel encodage. Après avoir fait tout cela...vous verrez, la performance ne sera pas trop changé, sans doute parce que la plupart du temps est passé en I/O. Si le fichier de sortie n'est pas sur le même disque que les entrées alors vous pourriez même essayer de faire de la lecture et de l'écriture asynchrone (pré-lecture du fichier suivant/morceau lors de l'écriture).
  • 45 fichiers d'une moyenne de 45 MO est juste un exemple, il peut être 'n' nombres de fichiers de 'm' de taille n, où n est dans milliers & m peut être de avg. 128 ko. En bref, il peut varier.
  • Nope, Pas d'attente du tout.J'ai juste besoin de faire l'mentionnées activité en un minimum de temps, c'est de l'optimisation, je suis à la recherche d'
  • Vous avez manqué mon point. 🙂 Encore une fois, les e/S disque va être une très grande partie du temps, et la plus grande n est plus il va prendre juste pour les i/o disque. En plus de cela, vous avez les frais généraux réels de création d'objet, de l'allocation de mémoire, GC, et ainsi de suite.
  • oui vrai,de sorte que toute chose comme parallèle de la lecture est possible d'assurer l'ordre d'écriture reste inchangé. Sera-ce plus rapide?
  • Merci, Disposer est considéré comme une meilleure pratique, donc j'avais gardé, sera certainement l'enlever maintenant. Merci pour les précisions!
  • une dernière remarque: si vous avez+ de 1000 fichiers, vous pouvez envisager d'utiliser un Répertoire.EnumerateFiles au lieu de Répertoire.GetFiles. Pour la même raison, je vous suggère de vérifier la taille du fichier de décider quelle méthode de copie est meilleure (une seule lecture ou plusieurs petits morceaux). Enfin, ne pas utiliser la fonction d'assistance AppendAllText: il s'ouvre et fermer le fichier pour chaque écriture.
  • Est-il conseillé d'utiliser quelques conseils & code unsafe pour fixer le processus?
  • non, la plupart du temps est consacré à la (lente) I/O disque, vous ne serez pas obtenir quelque chose pour utiliser le code unsafe. Il est préférable de simplement restructurer le code afin de ne pas gaspiller la mémoire/CPU et d'améliorer l'algorithme (ok, même le multithreading pour les e/S est d'une certaine manière empirique). Eh bien, vous pouvez envisager de réécrire votre code pour utiliser ReadFileScatter et WriteFileGather mais franchement je ne sais pas combien de boost de performance, vous aurez (par rapport à l'effort de les utiliser, au moins jusqu'à très grande vitesse des disques Ssd sera assez commun).
  • Double Possible de moyen Efficace de combiner plusieurs fichiers de texte

InformationsquelleAutor Pratik | 2013-01-25