Comment accélérer l'écriture des données sur un fichier

islem1982 Messages postés 22 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 4 octobre 2007 - 1 oct. 2007 à 02:45
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 4 oct. 2007 à 13:18
Bonjour tout le monde,

En essayant de programmer efficacement un algorithme de fouille de données, j'ai fait face à un problème majeur, à savoir le temps consommé par l'écriture des données sur un fichier. J'ai remarqué expérimentalement qu'il influence considérablement sur les temps d'exécution de la quasi-totalité des algorithmes de fouille de données (il est connu que ces algos consomment peuvent générer un nombre de résultats exponentiel [o(2^n) dans mon cas]). Ainsi, améliorer les temps consommés par toute implémentation dans l'écriture est d'une importance capitale.

La question est la suivante, y a-t-il des classes en C++ ou des techniques développés qui permettent d'accélérer l'écriture sur disque de données volumineuses?

Merci d'avance.

SIGMA

6 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
1 oct. 2007 à 10:16
Je ne sais pas de quelle manière tu écris tes données mais une solution optimale et de bufferiser les données jusqu'à une certaine quantité (ex : 500.000 octets) puis de faire une écriture par bloc en utilisant l'API Win32 (CreateFile, WriteFile, CloseHandle).
Après à toi de détérminer la taille optimale pour ton buffer, en faisant des test successifs sur un cas nominal.

En gros tu mémorises une certaines quantité dans un buffer. Une fois le buffer plein, tu l'ecris d'un bloc dans ton fichier avec WriteFile. Ensuite tu remets ton buffer à zéro, et tu refais la même chose.

Shell
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
1 oct. 2007 à 11:50
Bien que cela aille de soi, j'espère que tu utilises des fichiers binaires.
0
islem1982 Messages postés 22 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 4 octobre 2007
2 oct. 2007 à 03:27
Je tiens tout d'abord à vous remercier. L'idée d'utiliser un buffer est excellente mais je crois que techniquement (utiliser des fonctionnalités relatives à windows) soit très contraignant. En effet, utiliser de telles fonctionnalités va nuire à la portabilité de mon programme qui doit être assurée.
Y a-t-il une classe standard ou standarisée qui permet de gérer la bufferisation au sein du C++. Ainsi, je pourrais exécuter mon programme indépendamment du système d'exploitation.

Merci

SIGMA
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
2 oct. 2007 à 16:49
Faut absolument utiliser un buffer. Aucun besoin des outils windows pour cela.
Il me semble que les outils du C++ (fstream, etc ...) gèrent deja un buffer avant d'écrire sur le disque, mais tu peux toujours le gérer toi meme.
0

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

Posez votre question
islem1982 Messages postés 22 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 4 octobre 2007
4 oct. 2007 à 00:04
Pouvez-vous m'indiquer un document ou un tutorial qui me permettra de maîtriser la manipulation de buffers dans les fstreams en C++.

Merci d'avance.

SIGMA
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 oct. 2007 à 13:18
Pour des tutoriels et exemples, google est ton amis.
Sinon, la doc de référence très utile:
http://www.cplusplus.com/reference/iostream/
0
Rejoignez-nous