Bonjour à tous,
je suis en train de me poser de sérieuses questions sur les TMemoryStream.
Je souhaite mettre une grosse quantité de données en mémoire, afin de les traiter de manière rapide en __int64 , en utilisant la pleine puissante de mon processeur 64 bits.
Pour se faire j'utilise la méthode LoadFromFile pour charger des fichiers, et celle-ci :
__int64 __fastcall CopyFrom(TStream* Source, __int64 Count);
Ok, pas de souci, sauf que :
void __fastcall WriteBuffer(const void *Buffer, int Count);
ne permet d'écrire que 32K de données ??? ( int et pas __int64 )
J'essaye tout de même, la limitation de 32K ne semble pas être effective, car j'arrive à traiter de grosses quantitées de données qui dépassent largement les 32K, première surprise, je ne trouve pas l'overload de la fonction en __int64
Seconde surprise, je charge progressivement des fichiers, jusqu'à 230Mo :
1 2 3 4 5 6 7 8
|
// copier ce fichier à la suite dans le bigbuffer
TMemoryStream *a;
a = new TMemoryStream();
a->LoadFromFile(Nom_Fichier);
char *buffer;
buffer = (char*) a->Memory;
this->BigBuffer->WriteBuffer(buffer,a->Size); |
et là BIM :
Le projet ifs.exe a déclanché la classe d'exception EOutOfMemory avec le message "mémoire insuffisante'
What the ... ???
Je teste vite fait pour vérifier que ce n'est pas un problème de limitation windows ou quelque chose dans le genre :
1 2 3 4 5 6 7
|
unsigned __int64 taille = 1024*1024*550;
MegaBuffer = new char[taille];
for (unsigned __int64 i = 0; i < taille; i++)
{
MegaBuffer[i]=0x66;
} |
Ce dernier code fonctionne très bien, en CTRL ALT SUPR je vois bien la mémoire de l'exécutable qui monte à plus de 550Mo
Un habitué des TMemoryStream pourrait-il m'éclairer? je dois rater un truc là
(La doc embarquée sur le C++ Builder ne me donne aucune indication intéressante ).
Partager