API Charger gros fichier en mémoire (pour les pros)

jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 - 12 nov. 2003 à 14:32
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 12 nov. 2003 à 16:38
Je me suis toujours demandé comment fonctionnait le système de Swap de Windows. Beaucoup de programme doivent traiter d'énormes fichiers (plusieurs centaines de Mo).
Cependant, il est évidemment impossible de charger de si gros fichier en mémoire vive qui serait plus que saturé !

Le problème, c'est qu'on ne peut pas ouvrir de gros fichier avec VB, car il donne l'ordre à Windows de systématiquement réserver la zone mémoire dans la RAM (correspondant à la taille du fichier) avant de charger le fichier dedans.
On obtient donc des "Out of Memory".

Je veux pourtant pouvoir traiter de gros fichier pour pouvoir les crypter entre autre (fichier .avi, .mp3, .pdf ...).
Il faut donc que j''aille au coeur de Windows en utilisant les API qu'utilise Windows pour le Swap et pour la gestion mémoire en général.

Est-ce que quelqu'un sait comment monter des parties d'un fichier en mémoire vive (par exemple, mettre les morceaux du gros fichier dans des buffers de 1Mo) ?

Je pense qu'il va falloir que je me dirige vers le C ou le C++ pour faire cela, mais je demande sur ce forum à tout hasard.

Merci

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2003 à 14:57
1 Mo est un tout petit buffer que tu alloueras avec HeapAlloc() auquel tu pourras passer GetProcessHeap() sur le 1er param.
Si tu vas au dela de 10 Mo je te conseille VirtualAlloc().
Pour des tailles enormes il te faudra traiter par bloc et etudier le FileMapping, C C++ conseille.
BruNews, ciao...
0
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
12 nov. 2003 à 15:39
Je crois que j'ai trouver la solution...

C'est tout simple, j'utilise l'API ReadFile et je spécifie le nombre d'octets que je veux lire.

Au préalable, je récupère tout d'abord le handle du fichier à ouvrir et je me place où je veux dans le fichier avec l'API SetFilePointer.

Private Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long

Private Declare Function SetFilePointer Lib "kernel32" _
(ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long

Je peux ainsi monter en mémoire des morceaux du fichier (grâce à l'API ReadFile).

C'est vraiment très simple.

Qu'en penses-tu ?

A+ et merci beaucoup de ton aide...

Amicalement,
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2003 à 15:45
C'est le mode normal de lecture, tout script ou interpretation finit chez ReadFile.
BruNews, ciao...
0
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
12 nov. 2003 à 15:52
Mais tu penses que je peux implémenter ma solution (c'est à dire charger un fichier en mémoire morceaux par morceaux dans le même buffer) en utilisant ReaFile ?

Ou est-ce qu'il vaut mieux utiliser HeapAlloc ou VirutalAlloc ?

Merci de ton aide...

Jock
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2003 à 16:38
Fais gaffe a ma syntaxe VB, je ne fais que du C ou ASM.
Tu utilises HeapAlloc pour obtenir un buffer.
pmem = HeapAlloc(GetProcessHeap(), 0, size);
Ensuite tu liras avec ReadFile dans pmem:
Dim dwret As Long
dwret = 0 ' pour verif ulterieure
ReadFile(hfile, pmem, tailleAlire, dwret, 0)
if dwret <> tailleAlire Then goto onFerme ' ERREUR LECTURE

' TRAITEMENT ICI

onFerme:
CloseHandle(hfile)
HeapFree(GetProcessHeap(), 0, pmem)
BruNews, ciao...
0
Rejoignez-nous