Bonjour je souhaite mapper en mémoire un fichier texte de plus de 216000 lignes
pour avoir un temps de traitement plus rapide
et pouvoir extraire la n iémé ligne dans un variable string ou ansistring
comment puis-je proceder?
merci beaucoup
Bonjour je souhaite mapper en mémoire un fichier texte de plus de 216000 lignes
pour avoir un temps de traitement plus rapide
et pouvoir extraire la n iémé ligne dans un variable string ou ansistring
comment puis-je proceder?
merci beaucoup
As-tu essayé de faire un Memo1->Lines->LoadFromFile avec ce gros fichier ?
Il y a un exemple qui m'as l'air assez simple ici et qui corresponds à peu près au même besoin que toi:
http://www.codeproject.com/file/findidaddressbook.asp
Memory mapped Files
C'est une technique très intéressante pour lire les gros fichiers, car on peut ainsi se déplacer dans le fichier aussi facilement que dans un buffer avec à la différence des fonctions classiques de lecture de fichier des performances nettement supérieures.
yarp
www.senosoft.com
Merci pour vos réponses
quelqun peut mettre un exemple pour mapper toto.txt par exemple?
car c'est trop compliquer a comprendre le site en anglais
merci encore!
Il n'y a pratiquement que du code dans l'article et fort peu de commentaires. Donc tout ce qu'on peut faire est un copier/coller du code.
La fonction findidaddressbook comporte tout le code nécessaire et suffisant pour faire un File Mapping:
CreateFile : Ouvre le fichier
CreateFileMapping & MapViewOfFile : créent le mapping sur le buffer du fichier (buf dans l'exemple)
UnmapViewOfFile & CloseHandle : libération
Le plus intéressant est la boucle for ou l'on charge un tableau (al) avec le contenu de buf (du fichier donc). Il te suffit d'enlever le code de relatif au regsitre, d'adapter la boucle for à ton besoin, d'ouvrir Toto.txt au lieu de pathw.
yarp
www.senosoft.com
Bonsoir a tous !
Je reviens sur mon topic car je n'y arrive toujour pas
voici mon code assez lent sans le fichier mappé je voudrait le meme mais avec un fichier mappé pour que ca aille plus vite pour des fichiers de 300 000 lignes
pour situer le contexte j'ai une listbox qui contient 1,2,3.....300000 qui correspond a la ligne souhaitée dans le fichier txt .
si quelqun peut m'aider maper le fichier et a travailler avec ce fameux fichier en gardant le meme principe en extrayant dans l'operateur >>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 IndexNom=ListNom->ItemIndex+1; int Compteur = -1; ifstream Fichier(MonFichier.c_str(),ios::in); while(Compteur < IndexNom) { // recupère la ligne courante istringstream LigneExtraite(Lecture.c_str()); Fichier.getline(Ligne,100); Lecture=Ligne; Compteur++; LigneExtraite>>Nom>>Param1>>Param2>>Param3>>Param4>>Param5; } Fichier.close(); // algo qui traite les parametre de la ligne selectionnée
d'apres les messages precedent je doit commencer par :
?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 hFile1 = CreateFile ((char *)MonFichier.c_str(),GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); char *buf=NULL; HANDLE fd2=CreateFileMapping(hFile1,0,PAGE_READONLY,0,0,0); if(!fd2) { CloseHandle(hFile1); } buf=(char *)MapViewOfFile(fd2,FILE_MAP_READ,0,0,0); if(!buf) { CloseHandle(fd2); CloseHandle(hFile1); }
Partager