Lire et traiter des fichiers en parallèle C #
J'ai de très gros fichiers que j'ai à lire et à traiter. Cela peut être fait en parallèle à l'aide de Threading?
Voici un peu de code que j'ai fait. Mais il doesen " semblent avoir un court temps d'exécution de la lire et traiter les fichiers les uns après les autres.
String[] files = openFileDialog1.FileNames;
Parallel.ForEach(files, f =>
{
readTraceFile(f);
});
private void readTraceFile(String file)
{
StreamReader reader = new StreamReader(file);
String line;
while ((line = reader.ReadLine()) != null)
{
String pattern = "\\s{4,}";
foreach (String trace in Regex.Split(line, pattern))
{
if (trace != String.Empty)
{
String[] details = Regex.Split(trace, "\\s+");
Instruction instruction = new Instruction(details[0],
int.Parse(details[1]),
int.Parse(details[2]));
Console.WriteLine("computing...");
instructions.Add(instruction);
}
}
}
}
source d'informationauteur patentul
Vous devez vous connecter pour publier un commentaire.
On dirait les performances de votre application est principalement limitée par IO. Cependant, vous avez encore un peu de CPU de travail dans votre code. Ces deux bits de travail sont interdépendants: votre CPU de travail ne peut pas démarrer jusqu'à ce que l'OI a fait son travail, et l'OI ne pas passer à côté de l'élément de travail jusqu'à ce que votre PROCESSEUR a fini avec la précédente. Ils sont à la fois tenant les uns les autres. Par conséquent, il est possible (expliqué au bas de l'écran) que vous verrez une amélioration de débit si vous effectuez votre IO - et le CPU travailler en parallèle, comme suit:
Je doute fortement que c'est ton CPU à travailler tenir les choses en place, mais si cela arrive à être le cas, vous pouvez également paralléliser étape 2:
Rappelez-vous, si votre CPU de travail est négligeable par rapport à la IO composant, vous ne verrez pas beaucoup de vitesse. Plus encore la charge de travail est, au mieux le pipeline va effectuer en comparaison avec le traitement séquentiel.
Puisque nous parlons de la performance note que je ne suis pas particulièrement enthousiasmé par le nombre d'appels de blocage dans le code ci-dessus. Si je faisais ça dans mon projet, je serais allé la async/await route. J'ai choisi de ne pas le faire dans ce cas car je voulais garder les choses faciles à comprendre et facile à intégrer.
De l'aspect de ce que vous essayez de le faire, vous êtes presque certainement d'e/s. La tentative de traitement parallèle dans le cas de ne pas l'aider et en fait ralentir le traitement en raison de outre les opérations de recherche sur les lecteurs de disque (à moins que vous pouvez avoir les données réparties sur plusieurs axes).
Essayer le traitement de l'lignes en parallèle à la place. Par exemple:
L'accès aléatoire à un non-disque dur SSD (lorsque vous essayez de lire/écrire des fichiers différents en même temps ou un fichier fragmenté) est généralement beaucoup plus lent que l'accès séquentiel (par exemple, lecture unique la défragmentation de fichiers), donc j'attends de traitement de fichier unique en parallèle pour être plus rapide avec des fichiers défragmentés.
Aussi, le partage des ressources entre les threads (par exemple, la Console.Écrire ou en ajoutant un "thread-safe" le blocage de la collection) peuvent ralentir ou bloquer/blocage de l'exécution, parce que certains des fils va avoir à attendre pour les autres threads pour accéder à cette ressource.