Oppure

Loading
02/12/07 21:56
claudio1980
Il mio problema è leggere file di dimensioni di diversi mega per l'esattezza 26.

Per rendere la lettura il più veloce possibile vorrei fare un unica lettura in un buffer abbastanza grande, naturalmente non posso dichiarare quanto segue:
void lpvBuffer[26000000]

perché ovviamente va in crash.

Allora ho visto che si puo creare uno spazio di memoria virtuale dedicato di tot byte divisibli per i byte di una pagina di memoria attraverso la funzione VirtualAlloc.

questo il codice dell'uso di VirtualAlloc:
BOOL CreateBuffer(UINT bytetoalloc, LPVOID &lpvBuffer)
{
  UINT num_pages;
  SYSTEM_INFO sSysInfo;
  GetSystemInfo(&sSysInfo);

  num_pages = (UINT)bytetoalloc/sSysInfo.dwPageSize;

  lpvBuffer = VirtualAlloc(NULL, (SIZE_T)num_pages*sSysInfo.dwPageSize, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE);
  if (lpvBuffer == NULL )
  {
    AfxMessageBox(_T("Impossibile Allocare!"));
    return FALSE;
  }
  	
  return TRUE;
}


e finqui totto ok, non mi restituisce errori, anche se il processo sul task manager non aumenta la dimensione della memoria allocata ne fisica ne virtuale

poi uso questa funzione così:
CFileException e;
CFile filePR;
UINT bytetoalloc;
LPVOID lpvBuffer = NULL;

if (filePR.Open(fd.GetPathName(), CFile::modeReadWrite ,&e))
{
  bytetoalloc = (UINT) filePR.GetLength();
  if (CreateBuffer(bytetoalloc, lpvBuffer))
  {
    if(filePR.Read(lpvBuffer, bytetoalloc))
    {
      .......
    }
  }
}

durante il debug seguendo passo passo vado dentro la funzione CFile::Read e all'interno viene eseguita la funzione FileRead che è quella che mi da errore, naturalmente "Errore sconosciuto" la variabili sono tutte ok, e non viene letto neanche un byte.

Sapete aiutarmi?
Ultima modifica effettuata da claudio1980 02/12/07 22:04
aaa
03/12/07 6:57
gantonio
Intanto non capisco perche' parli di linguaggio C# (il codice mostrato non e' in C# ma in C++ e MFC) ...

Comunque, perche' scomodare funzioni come la VirtualAlloc che non fanno quello che ti serve ma ben altro? Usa la semplice allocazione dinamica del C

   char *buff;

   if(!(buff=(char *)malloc(26000000)))
   {
      printf("Errore durante l'allocazione del buffer\n");
      return 1;
   }
	
   /* lettura del file */

   free(buff);

   return 0;


oppure del C++

   char *buff;

   try
   {
      buff = new char[26000000];
   }
   catch(std::bad_alloc)
   {
      cout << "Errore durante l'allocazione del buffer" << endl;
      return 1;
   }

   // lettura del file

   delete buff;

   return 0;
aaa
03/12/07 13:12
pierotofy
Postato originariamente da gantonio:

Intanto non capisco perche' parli di linguaggio C# (il codice mostrato non e' in C# ma in C++ e MFC) ...


Ahm, quello è un errore mio. Il sistema che si occupa di identificare il linguaggio del source è ancora da perfezionare. :ot:
Il mio blog: piero.dev
03/12/07 13:27
gantonio
Sorry. Non lo sapevo.
aaa