2010-07-14 6 views
0

Mon application calcule en continu les chaînes et les affiche dans un fichier. Cela fonctionne pendant presque toute une journée. Mais écrire au fichier ralentit mon application. Y a-t-il un moyen d'améliorer la vitesse? Aussi, je veux étendre l'application afin que je puisse envoyer les résultats à un autre système après un certain laps de temps.Besoin d'aide pour écrire mes résultats dans un fichier

Merci & Cordialement,

Mousey

+4

Montrez-nous le code qui remplit le fichier. D'un autre côté, êtes-vous sûr que l'IO est le goulot d'étranglement? – mbq

+3

Si vous échangez les lignes 4211 et 4212 et remplacez 'foo' par' bar' à la ligne 340857, je prédis que votre application sera considérablement plus rapide. – sbi

Répondre

3

Il y a plusieurs choses qui peuvent ou ne peuvent pas vous aider, selon votre scénario:

  1. Envisagez d'utiliser d'E/S asynchrone, par exemple en utilisant Boost.Asio. De cette façon, votre application n'a pas besoin d'attendre la fin des opérations d'E/S coûteuses. Cependant, vous devrez mettre en mémoire tampon vos données générées en mémoire, alors assurez-vous qu'il y en a suffisamment.
  2. Envisagez de mettre en mémoire tampon vos chaînes à une certaine taille, puis écrivez-les sur le disque (ou le réseau) en gros lots. Peu de grosses écritures sont habituellement plus rapides que beaucoup de petites.
  3. Si vous voulez vraiment faire du bon C++, ce qui signifie STL -comliant, faites de votre algorithme une fonction-modèle qui prend et output-iterator comme argument. De cette façon, vous pouvez facilement l'écrire dans des fichiers, le réseau, la mémoire ou la console en fournissant des itérateurs appropriés.
1

Comment si vous écrivez les résultats à une prise, au lieu de fichier. Un autre programme Y, va lire le socket, ouvrir un fichier, écrire dessus et le fermer, et après le temps spécifié va transférer les résultats à un autre système.
Je veux dire que le traitement des fichiers est géré par un autre programme. Le programme original X envoie juste la sortie au socket. Cela ne le concerne pas en vidant le flux de fichiers.

Je veux aussi étendre l'application afin que je puisse envoyer les résultats à un autre système après un certain laps de temps particulier.

Si vous voulez juste transférer le fichier à un autre système, alors je pense qu'un simple script suffira pour cela.

1

Utilisez plus d'un fichier pour la journalisation. Supposons que, après que votre fichier ait atteint la taille de 1 Mo, changez son nom en quelque chose qui contient la date et l'heure et commence à écrire dans un nouveau, nommé comme le nom de fichier d'origine. alors vous avez:

results.txt

results2010-1-2-1-12-30.txt (2 Janvier 2010, 01:12:30)

et ainsi de suite.

+0

Comment cela va-t-il accélérer le programme? Cela signifie-t-il que l'écriture dans des fichiers de taille supérieure à 1 Mo est un processus lent et qu'il devient de plus en plus lent avec l'augmentation de la taille? Veuillez expliquer. Merci –

0

Vous pouvez mettre en mémoire tampon le résultat de différents calculs en mémoire et n'écrire dans le fichier que lorsque le tampon est plein. Par exemple, vous pouvez concevoir votre application de telle sorte qu'elle calcule le résultat pour 100 calculs et écrit tous ces 100 résultats à la fois dans un fichier. Puis calcule un autre 100 et ainsi de suite.

0

L'écriture d'un fichier est évidemment lente, mais vous pouvez mettre des données en mémoire tampon et lancer le thread séparé pour se tordre dans un fichier. Cela peut améliorer la vitesse de votre application.

Deuxièmement, vous pouvez utiliser ftp pour transférer des fichiers vers un autre système.

0

Je pense qu'il y a des harengs rouges ici. Sur un système informatique plus ancien, je recommanderais de mettre en cache les chaînes et de faire un petit nombre de grosses écritures au lieu d'un grand nombre de petites écritures. Sur les systèmes modernes, la mise en cache disque par défaut est plus que suffisante et il est peu probable que la mise en mémoire tampon supplémentaire soit utile.

Je présume que vous ne désactivez pas la mise en cache ou l'ouverture du fichier pour chaque écriture.

Il est possible qu'il existe un problème avec l'écriture de très gros fichiers, mais ce ne serait pas ma première estimation.

Quelle est la taille du fichier de sortie lorsque vous avez terminé?

Qu'est-ce qui vous fait penser que le fichier est le goulot d'étranglement? Avez-vous des données de profilage?

Est-il possible qu'il y ait une fuite de mémoire? Un code ou des statistiques que vous pouvez publier aideraient dans le diagnostic.

Questions connexes