Je tente d'implémenter la fonctionnalité de journalisation dans une application devant s'exécuter en temps réel (ce qui signifie que l'écriture de quelques millisecondes dans un fichier pendant l'exécution du La boucle affectera significativement les performances car nous interagissons avec plusieurs systèmes nécessitant une faible latence. Mon implémentation actuelle enregistre une ligne dans un stringstream chaque objet milliseconde, et écrit ensuite la chaîne résultante à un fichier uniquement lors de l'arrêt:Journalisation à l'aide de stringstream C++ stl avec des exigences de performances en temps réel
class ControlDemo {
public:
ControlDemo();
~ControlDemo();
void spin();
// Other public methods
private:
void logLine(std::vector<double> data);
void writeLogFile();
std::stringstream m_logged_data;
std::string m_log_filename;
bool m_continue_spinning;
// Other private methods
};
ControlDemo::~ControlDemo() {
writeLogFile(); // write log data in RAM to a file
}
void ControlDemo::spin() {
while(m_continue_spinning){
// do stuff
logLine(data_to_log);
sleepRemainingTime(); // maintaining ~1ms loop rate
}
}
void ControlDemo::logLine(std::vector<double> data) {
m_logged_data << getCurrentTime();
for (std::vector<double>::iterator it = data.begin(); it != data.end(); ++it)
m_logged_data << ', ' << *it;
m_logged_data << std::endl;
}
void ControlDemo::writeLogFile() {
std::ofstream file;
file.open(m_log_file_path.c_str());
file << m_logged_data.str();
file.close();
std::cerr << "Wrote log to " << m_log_file_path << std::endl;
}
Mon désir est de mettre en œuvre un certain type de fonctionnalité de mise en mémoire tampon dans lequel je peux spécifier le nombre maximum de lignes dans mon journal, après quoi, les lignes initiales seront rejetées (essentiellement un tampon circulaire). De cette façon, je ne gaspille pas beaucoup de RAM et ralentis mon application en continuant à accumuler des données enregistrées, alors que peut-être seulement les 20 dernières secondes de données sont importantes. Je tentai en modifiant la méthode logLine()
comme suit:
void ControlDemo::logLine(std::vector<double> data) {
static int line_num = 0;
if(line_num < m_max_num_lines)
line_num++;
else // discard first line before inserting next line
m_logged_data.ignore(1000,'\n'); // move get ptr to next line
m_logged_data << getCurrentTime();
for (std::vector<double>::iterator it = data.begin(); it != data.end(); ++it)
m_logged_data << ', ' << *it;
m_logged_data << std::endl;
}
Cependant, le m_logged_data.str()
qui est appelé à writeLogFile()
retourne encore toutes les données enregistrées plutôt que seulement le dernier m_max_num_lines
, ce qui suggère que le déplacement du pointeur stringstream obtenir avec ignore()
ne affecter la taille du tampon utilisé par l'objet stringstream ou optimiser le code de l'une des façons que je voulais.
je me sens comme soit je manque quelque chose évidente de la classe stringstream
(pourquoi est-il pas un setBufferSize()
?? voir this), ou devrais-je être à utiliser une autre pour gérer la fonctionnalité de journalisation. Si ce dernier, des suggestions sur quelle classe je devrais utiliser? L'une des bonnes choses à propos de stringstream
est l'ensemble des fonctionnalités de mise en forme intégrées, que j'utilise (même si je ne l'ai pas montré dans les extraits de code ci-dessus). Donc, conserver ces capacités de formatage serait bien si possible.
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. –
Quelles sont les exigences de formatage? – EvilTeach
combien de mémoire disposez-vous pour stocker les informations de journalisation? – EvilTeach