Accueil > Forum > > > > Gros fichier mémoire (block par block)
Gros fichier mémoire (block par block)
lundi 16 février 2004 à 12:09:42 |
Gros fichier mémoire (block par block)

jockos
|
Bonjour, Je développe un logiciel de cryptage. Mon logiciel doit pouvoir crypter de très gros fichier (plusieurs centaines de Mo). Je monte le fichier en mémoire block par block (1 bloc = 64 Ko par exemple) et crypte donc block par block en mémoire pour ensuite redescendre le block crypté dans le fichier de destination. C'est très rapide jusqu'à des fichiers de 120 Mo (environ 3 secondes), mais au dessus de 120 Mo, ça devient très long (20 secondes environ). J'ai 256 Mo de RAM... J'utilise un buffer (unsigned char *) pour stocker mes blocs. J'ai essayé avec les API ReadFile et WriteFile et aussi avec les fonctions C++ fread et fwrite et j'obtiens toujours le même résultat. Le problème vient donc de Windows. Il doit s'embrouiller dans le Swap ou je ne sais pas quoi... C'est assez déroutant... 120 Mo --> très rapide 130 Mo --> très lent ???? Merci pour votre aide...
|
|
lundi 16 février 2004 à 12:18:37 |
Re : Gros fichier mémoire (block par block)

jockos
|
Pour infos, j'utilise Windows XP.
A chaque fois, il est plus lent au 1er traitement du fichier. Quand je retraite le même dichier, il va beaucoup plus vite à partir de la 2ème fois.
Pour les fichiers très gros (200Mo), il arrive qu'il aille très vite (2, 3 secondes, comme pour le fichier de 120Mo) et puis d'un seul coup, il va mettre 20 secondes...
Comment booster Windows pour le rendre performant sur chaque traitement d'ouverture et de sauvegarde du block, car le problème de performance semble venir uniquement de la gestoin mémoire faite par Windows.
|
|
lundi 16 février 2004 à 12:22:30 |
Re : Gros fichier mémoire (block par block)

vecchio56
|
Tu devrais utiliser des blocs d'un mo, ce serait mieux. Je te conseille d'utiliser ReadFile pour la lecture et HeapAlloc pour l'allocation de mémoire. Pour ton problème, j'èspère que tu ne fais l'allocation qu'un fois, sinon ton pb à partir de 130mo est très bizarre. Tu pourrais peut être mettre ton code pour voir?
|
|
lundi 16 février 2004 à 12:34:52 |
Re : Gros fichier mémoire (block par block)

jockos
|
J'utilise un bloc de 64Ko, car c'est ce qui est le plus rapide... (j'ai fais plusieurs tests et comparer les résultats du Benchmark).
Mon programme traite aussi des tout petit fichier...
Je te met mon code...
|
|
lundi 16 février 2004 à 14:44:03 |
Re : Gros fichier mémoire (block par block)

jockos
|
Voilà mon code...
Pour simplifier, il ne traite pas le cas ou le dernier bloc à charger en mémoire a une taille inferieur à la taille d'un bloc.
Par exemple, pour un fichier de 200 Ko, sachant qu'un bloc fais 64Ko, je vais faire : Bloc 1 : 64 Ko Bloc 2 : 64 Ko Bloc 3 : 64 Ko Bloc 4 : 64 Ko (au lieu de 8 Ko)
//////////////////////////////////////////////////////////////////// #define BLOC_SIZE 64 //taille d'un bloc en Ko
bool OpenFileByBloc (char * filename) { HANDLE hFile, hHeap; LPVOID pBloc; //pointeur sur le buffer contenant les blocs DWORD lengthFile; //taille totale du fichier (en octets) DWORD lengthBloc; //taille d'un bloc (en octets) /* création du handle sur le fichier à ouvrir */ hFile = CreateFile (filename, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0); if (hFile == INVALID_HANDLE_VALUE) return FALSE; /* taille en octets du fichier à ouvrir */ lengthFile = GetFileSize (hFile, 0); /* taille en octets du buffer */ lengthBloc = BLOC_SIZE * 1024;
/* allocation mémoire du buffer recevant les blocs du fichier */ hHeap = GetProcessHeap(); pBloc = HeapAlloc (hHeap, HEAP_ZERO_MEMORY, lengthBloc); if (pBloc == NULL) return FALSE;
/* position du curseur dans le fichier (position du bloc à traiter) */ DWORD i = 0; /* nombre d'octets lu par ReadFile */ DWORD lengthRead = 0; /********************************************/ while (i < lengthFile) { /* place le curseur sur le bloc à monter en mémoire */ SetFilePointer (hFile, i, 0, FILE_BEGIN);
/* charge le morceau du fichier en mémoire dans le bloc "pBloc" */ ReadFile (hFile, pBloc, lengthBloc, &lengthRead, 0); /* passe au bloc suivant */ i = i + lengthBloc;
} /********************************************/
/* libère le buffer */ HeapFree (hHeap, 0, pBloc); /* ferme le fichier */ CloseHandle (hFile);
return TRUE; }
|
|
lundi 16 février 2004 à 14:50:41 |
Re : Gros fichier mémoire (block par block)
|
lundi 16 février 2004 à 15:01:07 |
Re : Gros fichier mémoire (block par block)

jockos
|
Pour le moment, pendant que je teste, je le met dans un Exécutable (console Win32).
Je l'appelle ainsi :
void main() { char filename[] = "c:\\test.txt";
StartBenchmark (); OpenFileByBloc (filename); printf ("%u\n", StopBenchmark());
return 0;
}
Merci pour ton aide...
|
|
lundi 16 février 2004 à 15:01:58 |
Re : Gros fichier mémoire (block par block)

vecchio56
|
oh pardon tu as posté ton code entre temps pour ton problème je dirais que c'est normal qu'il mettent longtemps pour les gros fichier, même si c'est bizarre qu'il saute brusquement vers 120mo, en tous cas je ne vois pas pq ce serait un pb de ram, puisque tu n'utilises en tout et pour tout que 64ko. J'ai essayé chez moi et il met environ 35s pour 700mo (mais avec des blocs de 1mo)
|
|
lundi 16 février 2004 à 15:16:49 |
Re : Gros fichier mémoire (block par block)

jockos
|
J'aimerais comprendre pourquoi le temps mis pour effectuer cet algo n'est pas proportionnel à la taille du fichier à charger.
C'est certainement à cause du gestionnaire de mémoire du noyau de Windows... Mais pourquoi ?
|
|
mardi 17 février 2004 à 00:25:42 |
Re : Gros fichier mémoire (block par block)

ymca2003
|
Je pense que lorsque tu lit un fichier, windows le garde dans un coin de la mémoire (pour pouvoir y accéder plus rapidement par la suite). C'est pour cela qu'au 2ème traitement c'est plus rapide. La rupture doit provenir du fait que la limite de stockage rapide est atteinte.
|
|
Cette discussion est classée dans : fichier, mo, gros, mémoire, block
Répondre à ce message
Sujets en rapport avec ce message
Segmenter un fichier en mémoire C (seulement) [ par golum ]
Voila pour ouvrir a partir de mon prog c un fichier de 20 Mo je met 1min et j'aimerais a tout pris diminuer ce temps.Est-il possible de segmenter le f
Gros Pb Visual C++ 6.0 [ par nathalieJ ]
Lors de l'installation de MS Visual Studio 6.0, j'ai un fichier qui est apparamment "corrupted", malgré les réinstallations multiples, l'installation
comment lire ou écrire à un fichier dans la mémoire ? [ par ilimo ]
bonjour,je sais ouvrir un fichier dans la mémoire..mais comment le lire à partir de cette même mémoire ?merci pour votre aide ...-------------j'utilis
Chemin de fichier avec fopen en tant que variable (gros débutant) [ par jason_red2 ]
Je m'explique:La fonction fopen admet, en tant qu'argument,des const char*, ce qui implique de définir le Path soit par une constante, un typedef pass
Visual C++ 2003 .NET [ par Logan ]
Bonjour,j'ai un gros problème,je tente aujourd'hui de compiler un put* de mod Mule, pour pouvoir après le modifier (et ui, fo deja arriver à le compil
Envoi de gros fichier en CPP via TServerSocket [ par topelamonpote ]
Bonjour tout le monde je suis en train de confectionner un Online videoServer ou une sorte de video à la demande. Est ce que qq un connait une bonne m
mémoire en trop [ par deck_bsd ]
Bonjour, Voici une procédure charger de remplir un liste chainée en lisant les donnée d'un fichier binaire : void LectureDuFichier(){ FILE *fich
Mémoire à allouer optimale pour une copie de fichier [ par 0v3rb1t ]
Bonjour.1) Je souhaiterai connaitre la valeur optimale de mémoire à allouer pour une copie de fichiers binaires.2) De quel type doit être le pointeur
charger bitmap depuis mémoire ?? [ par cybermax62 ]
je voudrais charger un bitmpa depuis une fichier.Je m'explique :je veux me faire un fichier du type *.pak pour stocker mes données (des images). Donc
Allocation mémoire [ par thedestiny ]
Voila je présente mon projet brievement :C'est un programme qui est censé ouvrir un fichier d'une taille assez conséquente ( 20 mo environ )Plusieurs
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|