Fichiers textes volumineux C/C++

Résolu/Fermé
liloon Messages postés 18 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 27 novembre 2015 - 17 juil. 2008 à 22:10
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 25 juil. 2008 à 08:50
niveau débutant, C/C++.

Bonjour,

J'ai réalisé un programme qui traite les données issues d'un .txt.
Je commence d'abord par supprimer les lignes inutiles du .txt en disant
que si le nbre de caractères de la ligne est < 14 =>je ne passe pas la ligne ds mon buffer.
Lorsque mon fichier .txt fait moins de 30 000 lignes le temps de traitement reste raisonnable.
Mais mes fichiers ont 150 000 lignes et 44 éléments par ligne !!!
Comment je peux faire pour traiter mes données?

Merci d'avance.
A voir également:

10 réponses

Spylk Messages postés 1807 Date d'inscription vendredi 8 février 2008 Statut Membre Dernière intervention 23 mars 2011 381
17 juil. 2008 à 22:19
salut !

le must pour traiter des fichiers texte ou des log de serveur etc etc pour moi c'est le langage Perl ....

ça atomise le c/c++ ... ça enterre le php .....le python etc



je pense que ça ne t'aide pas dans l'immédiat, mais c'est toujours bon à savoir ...
0
amirah Messages postés 30 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 23 février 2011 1
17 juil. 2008 à 22:20
Salut, j'ai eu un problème proche de ça je te propose comment je l'ai résolu peut être t'aideras.
J’ai divisé mon fichier de données à des fichiers que je l'ai mis tous dans un fichier tu le fait manuellement ou tu programme un petit code c'est facile. Puis tu traite dans ton programme tout les fichiers dans ce dossier.
0
liloon Messages postés 18 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 27 novembre 2015 1
17 juil. 2008 à 22:50
J'y ai pensé mais je voulais justement éviter de faire des sous fichiers puis faire une concaténation mais si jamais je ne trouve pas de solution par exemple peut etre un format plus rapide à traiter je ferai peut etre ça mais je trouve pas ça pratique :s

Merci kan meme!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 juil. 2008 à 08:28
Salut.
Je n'ai pas ta réponse, mais quelques réflexions.
Si je comprends bien, tu met tout ton fichier en mémoire, si c'est le cas, le problème peu venir de là, essai de charger seulement une partie du fihier, de le raité, de vider la mémoire puis de continuer.
Car en est-ce vraiment la taille de ton fichier qui rend long, ou la quantité de données stocker en mémoire ? Si tu fractionne ton fichier, chaque segment sera traiter plus vite, mais le tout le sera til ?

Sans le code, il est difficile de se faire une idée, il est possible que tu fasse une énormité conduisant à ce ralentissement.
0
liloon Messages postés 18 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 27 novembre 2015 1
22 juil. 2008 à 22:17
En effet je passe tt dans le buffer et mon .txt fait 10 Mo. Hmm, je vois ce que tu vx dire mais je ne vois pas encore comment mettre en oeuvre la partie "essai de charger seulement une partie du fichier" à part séparer le fichier comme le suggère amirah. Mais mais je cherche ;) merci. voilà l'extrait du code:

//Effacer toute les lignes contenant - de 13 caractères
//C'est à dire toutes les différentes de la matrice image

std::ifstream ReadMovieFile( inputfile );
if (ReadMovieFile) //Si le fichier est trouvé
{
std::string line;
int Line = 0;
while ( std::getline( ReadMovieFile, line)) //Parcourir le fichier et initialiser line à la ligne actuelle
{

Line++;

if(line.size()>13) // Si la ligne atteinte est différente de la ligne à supprimer...
{
Buffer += line + "\n"; //Rajouter le contenu
}
}
}

ReadMovieFile.close(); //On ferme le fichier en lecture

std::ofstream WriteMovieFile( inputfile ); //Ouvrir en écriture
WriteMovieFile << Buffer;
WriteMovieFile.close(); //Fin
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
23 juil. 2008 à 00:49
Bonsoir,

Je ne comprends pas pourquoi tu charges ton fichier en mémoire ?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
23 juil. 2008 à 10:39
essai un truc du genre :
//Effacer toute les lignes contenant - de 13 caractères
//C'est à dire toutes les différentes de la matrice image

std::ifstream ReadMovieFile( inputfile );
std::ofstream WriteMovieFile( outputfile ); //Ouvrir en écriture

if (ReadMovieFile) //Si le fichier est trouvé
{
std::string line;
int Line = 0;
while ( std::getline( ReadMovieFile, line)) //Parcourir le fichier et initialiser line à la ligne actuelle
{

Line++;

if(line.size()>13) // Si la ligne atteinte est différente de la ligne à supprimer...
{
WriteMovieFile <<  line + "\n"; //Rajouter le contenu
}
}
}

ReadMovieFile.close(); //On ferme le fichier en lecture
WriteMovieFile.close(); //Fin
rename(outputfile,inputfile);//renomme le fichier temporaire en fichier source
là tu ne devrai plus avoir de souci de perf
0
liloon Messages postés 18 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 27 novembre 2015 1
24 juil. 2008 à 13:04
Merci Char Snipeur ça marche impec!

En effet, je perds inutilement du temps en passant par mon buffer. Je me ss obstiné à utiliser un seul fichier .txt.
Now 200 000 lignes * 44 colonnes en à peine 20-25 s.

Par contre, si quelqu'un à un tuto, un lien ou un post intéressant sur la concaténation de .txt en C/C++, je ss preneur.
J'imagine qu'il doit y avoir une fonction optimisée pr ça mais pr l'instant j'ai trouvé que des infos pr DOS sinon je passerai par ifstream et ofstream pr lire les fichiers et les écrire les uns à la suite des autres ds un meme .txt mais je sens que c'est la meilleure chose à faire...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 juil. 2008 à 15:21
si tu ouvre ton fichier en "append", ton pointeur se met directement à la fin du fichier, et comme ça, tu lit le deuxième et écris directement dans le premier. Je ne suis pas sur qu'il y ai forcément plus rapide, car je pense (à vérifier) qu'une concaténation nécessite le déplacement de données.
0
liloon Messages postés 18 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 27 novembre 2015 1
24 juil. 2008 à 20:06
Ok je v essayé ça ce w.e ça devrait etre assez rapide. Par curiosité je v continuer à chercher une autre soluce en C++. Par ailleurs, j'ai lu qu'il y avait des ptits logiciels qui font de la concaténation de fichiers.
Bon ben... pb résolu on va dire!!
Merci bcp Char Snipeur!!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 juil. 2008 à 08:50
le plus simple pour concaténé fic2 à la suite de fic1, c'est
type fic2>>fic1 sous windows
cat fic2>> fic1 sous linux. Ces petits logiciels sont standard.
0