2017-08-19 1 views
2

J'ai un fichier texte de configuration sur un système embarqué avec un système d'exploitation Linux. Les exigences sont que le fichier est du texte, et le système embarqué a 32 mégaoctets de RAM dynamique. L'application. qui lira le fichier est codé en C++.Fragmentation de la mémoire à partir de la lecture du fichier dans le système embarqué

Le fichier peut être lu en utilisant une méthode comme celle-ci.

#include <string> 
#include <fstream> 

ifstream infile ("config_file_path");  
if (infile.good()) 
{ 
    string line; 
    // Set capacity to length of the longest line. 
    const unsigned char maxLen = 100; 

    line.reserve (maxLen); 

    while (std::getline (infile, line)) 
    { 
     // Process the data in the line. 
     processData (line); 
    } 
} 

Est-ce que la fragmentation de tas serait un problème pour cette implémentation? Le fichier peut contenir jusqu'à 150 lignes de texte à lire.

+0

Vous pouvez utiliser une chaîne avec un allocateur personnalisé, de sorte que vous allouez la mémoire comme vous le souhaitez – DarthRubik

+2

Quel genre de problème attendez-vous? 32 Mo est un gros morceau de mémoire.Mais pour éviter toute fragmentation, je suggère d'allouer un morceau qui serait la taille du fichier et le charger (sans tampon, avec 'read') avec le contenu du fichier. Oubliez les 'chaînes', utilisez 'char *' – Serge

+3

Dépend de la durée de vie de ce code. Si elle est exécutée une fois et se termine rapidement - probablement, pas de problème. Si vous avez besoin d'une robustesse et d'une disponibilité élevées - Keep It Simple. – ddbug

Répondre

0

Est-ce que la fragmentation tas un problème pour cette la mise en oeuvre?

Dans l'exemple affiché, je ne peux pas identifier une ligne indiquant une fragmentation de tas.

Vous utilisez l'objet std::string dont les mécanismes internes sont généralement considérés comme imprévisibles, c'est-à-dire la taille de l'objet et sa libération.

  • Dans un premier temps, considérons std::string::capacity pour assurer une mémoire plus compacte.

  • Dans un deuxième temps envisager de fournir custom allocators, des solutions de rechange spécifiques au magasin libre générale (tas) sont: Piscine et Stack. Dans une dernière étape, pensez à utiliser un code moins abstrait, c'est-à-dire des pointeurs, des tableaux, etc., ce qui est la solution inévitable lorsque vous vous rapprochez du matériel. en particulier lorsque vous utilisez l'objet juste pour extraire l'entrée et passer comme paramètre, à savoir pas d'utilisation de l'une des fonctions membres spécifiques std::string, etc.

+1

Merci pour la réponse. La capacité de la chaîne individuelle ne change jamais lorsqu'une quantité suffisamment importante est réservée. Je vais envisager de créer un allocateur personnalisé et un tableau char pour contenir les pointeurs de données et de char pour travailler avec. – netcat

1

Il est difficile de dire si votre application souffre de la fragmentation de la mémoire de votre code. (Votre code peut ajouter une certaine fragmentation, mais je ne sais pas à quel point il est) vous pouvez essayer d'utiliser les bibliothèques malloc non standard - jemalloc nedmalloc tcmalloc ils pourraient vous donner de meilleurs objets mise en page ainsi que d'une capacité de décharge la mise en page mémoire

approche générale:

vérifier si l'application peut obtenir « pas assez de mémoire ». test de stress pourrait aider. Vérifiez la quantité de mémoire disponible dans votre application et la taille de celle-ci. si la fragmentation est le problème - essayez ce qui suit: heap aime le principe LIFO (supprimer le dernier bloc créé). essayez de garder les variables sur la pile. utiliser des allocateurs spécialisés.

en cas de votre fonction:

afin de minimiser la pression de tas, vous pouvez essayer de lire les lignes dans une mémoire tampon de la pile (par exemple à l'aide fgets)

+0

Merci pour l'info. Un tampon de pile est une bonne idée pour conserver les données. Cela n'a pas encore été implémenté. J'étais préoccupé par la minimisation de l'utilisation du tas. – netcat