2009-02-26 6 views
0

Je fais de longues simulations qui peuvent prendre de plusieurs heures à plusieurs jours et j'enregistre les informations dans des fichiers. Les fichiers peuvent atteindre des tailles de centaines de Mb et à l'intérieur il y a juste une liste de nombres. Je suis vraiment préoccupé par les frais généraux que cela entraîne. Je voudrais demander si le surcoût de l'utilisation de cette méthode est vraiment important et s'il existe une autre méthode plus efficace pour faire la même chose, il suffit de consigner les informations. J'utilise C++ et pour enregistrer les fichiers, j'utilise simplement les méthodes courantes de fprintf. Pour expliquer les frais généraux si vous pouvez donner un exemple pratique similaire à, en utilisant des fichiers qu'il prend cette fois sans les utiliser cette fois, ce sera idéalement.Surcharge des informations de journal dans les fichiers

J'ai fait quelques tests, mais je n'ai aucune idée si le surcoût se développe linéairement avec la taille des fichiers. Ce que je dis est que peut-être n'est pas le même ajouter une ligne à un fichier d'une taille de 1 Mo d'un fichier de taille de 1 Go. Est-ce que quelqu'un sait comment les frais généraux grandir avec la taille du fichier?

Répondre

4

Vous avez juste besoin de quelques calculs de retour à l'arrière, je pense.

Laissez «centaines de Mb» être 400 Mo.
Laissez "plusieurs heures à plusieurs jours" soit 48 heures.

(400 * 1024 * 1024 octets)/(3600 * 48 secondes) = 2427 octets/sec

De toute évidence, vous pouvez juste regarder votre système ou utiliser des nombres réels pour le calcul, mais en utilisant l'estimation approximative ci-dessus vous vous connectez à environ 2 Ko/s, ce qui est plutôt trivial comparé aux limites de disque dur moyennes. Donc, non, le surdébit ne semble pas être très important. Et oui, il existe des moyens plus efficaces de le faire, mais vous passeriez probablement plus de temps et d'efforts que cela vaut pour les économies minuscules que vous obtenez, à moins que vos chiffres soient très différents de ce que vous avez déclaré.

+0

Salut Nathan merci pour votre réponse, juste pour la curiosité et peut-être pour les futurs utilisateurs qui voient la question pouvez-vous fournir des lignes directrices si cela est possible sur des façons plus efficaces de le faire. – Eduardo

+0

"Efficace" est un terme un peu vague, mais en général, vous essayez d'en faire plus avec moins de ressources. Donc généralement vous vous concentrez sur les goulots d'étranglement. Écrire trop sur le disque? Connectez-vous moins. Ou connectez-vous dans un format binaire qui utilise moins d'espace. Ou n'écrivez pas sur le disque. Ecrivez sur un disque virtuel, un lecteur réseau, etc. – Nathan

+0

Faites également attention aux ressources inutilisées. Votre processus est-il lié au processeur avec peu d'utilisation de la mémoire? Peut-être stocker tous vos journaux en mémoire jusqu'à la fin de la tâche. Les processus sont-ils gourmands en mémoire, mais légers sur le cpu?Pipe la journalisation à travers un outil de compression CPU-intensive avant d'écrire sur le disque. – Nathan

2

"Des centaines de mégaoctets" est probablement hors de propos au cours de quelques jours. Des centaines de gigaoctets pourraient bien être importants, mais ils ne seraient probablement pas encore énormes.

Il existe un moyen évident de trouver la réponse à votre application exacte: exécuter une simulation avec la journalisation activée et l'heure. Puis exécutez-le (avec la même entrée) avec la journalisation désactivée, et l'heure. Comparez la différence. Idéalement, faites ceci plusieurs fois pour contrebalancer d'autres perturbations. Je soupçonne que vous constaterez que l'avantage potentiel de beaucoup d'abattage l'emporte largement sur la performance.

1

Vous pouvez mettre des données en vecteur STL et effectuer un profilage sur vos données, par exemple:
- exclure les lignes répétées;
- sauvegarder seulement les différences;
- vider les données après quelques instants;
- sélectionner des données spécifiques à enregistrer;
- etc ...

Questions connexes