2017-05-16 4 views
-4

Je dois lire en gros fichiers txt (1Go) ligne par ligne, et utiliser fgets() pour le faire. Je cours une boucle while vide et l'exécution prend extrêmement long (30mins) avec 99% d'utilisation du processeur.Utilisation du processeur 99% lors de la lecture d'un gros fichier txt en utilisant fgets() C++

int buffer_size = 30; char buffer [buffer_size]; J'ai fait quelques lectures et apparemment les frais généraux liés à l'analyse de texte provoquent ceci. Donc la question est, est-il un moyen de lire dans un fichier txt tout en évitant cela? Je lis des traces pour un simulateur de réseau, donc chaque ligne a typiquement | Injection_cycle source destination |

Je cherchais depuis un certain temps, donc si quelqu'un a une réponse intelligente à ce que je serais absolument ravi :)

+0

Bienvenue dans Stack Overflow. Veuillez prendre le temps de lire [The Tour] (http://stackoverflow.com/tour) et de consulter le contenu du [Centre d'aide] (http://stackoverflow.com/help/asking) quoi et comment vous pouvez demandez ici. –

+0

"J'ai fait quelques lectures et apparemment les frais généraux liés à l'analyse de texte provoquent cela." - il n'y a pas d'analyse en cours dans le code que vous avez posté. –

+0

Cela ne devrait pas prendre 30 minutes pour lire un fichier de 1 Go de cette façon. Quelque chose ne va pas. (La petite taille de la mémoire tampon n'aide pas, mais cela ne peut pas être tout le problème.) –

Répondre

0
1GB = 1024MB= 1048576 KB = 1073741824 B 
30 min = 1800 seconds 

Vous comparez essentiellement sur 595K/comparaisons de (vérifier si le le caractère courant est '\ n' ou '\ t' ou eof) et fait autour de la même quantité d'assignations de mémoire. Non seulement cela, mais aussi faire une opération de saut puisque vous avez une déclaration de boucle. Même si ce n'est pas trop rapide, ce n'est pas trop lent non plus, j'ai vu quelques "cas critiques" qui ne peuvent pas utiliser correctement le système de mémoire de l'ordinateur, comment le résultat varie-t-il pour différentes tailles?

Je pense que je suis plutôt hors de la raison, mais j'espère que cela aide

+0

Merci beaucoup pour votre réponse !! J'ai varié la taille du fichier, mais même pour 1 Mo je reçois ce comportement d'utilisation et cela prend terriblement longtemps:/Ne peut toujours pas comprendre ce que c'est ... – Quavo

+0

il pourrait être que votre taille de tampon est trop petite? d'après ce que j'ai lu sur http://www.cplusplus.com/reference/cstdio/fgets/, il ne remplira le tampon qu'avec 30 caractères ou jusqu'à ce qu'il trouve un nouveau caractère de ligne. il ne détecte que le nouveau caractère de ligne ou eof, ce qui pourrait être la raison, dans votre livre moyen, il est rare de trouver des caractères aussi petits, avez-vous essayé de l'élever à 100-200? –