begin process at 2012 05 29 07:28:12
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Fichier / Disque

 > 

Gros fichier mémoire (block par block)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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)

vecchio56

Administrateur CodeS-SourceS
tu le mets ou??
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

Administrateur CodeS-SourceS
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.



1 2

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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,312 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales