Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Letture di grandi file
Forum - C/C++ - Letture di grandi file

Avatar
claudio1980 (Normal User)
Newbie


Messaggi: 1
Iscritto: 02/12/2007

Segnala al moderatore
Postato alle 22:56
Domenica, 02/12/2007
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:
Codice sorgente - presumibilmente C/C++

  1. 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:
Codice sorgente - presumibilmente C#

  1. BOOL CreateBuffer(UINT bytetoalloc, LPVOID &lpvBuffer)
  2. {
  3.   UINT num_pages;
  4.   SYSTEM_INFO sSysInfo;
  5.   GetSystemInfo(&sSysInfo);
  6.  
  7.   num_pages = (UINT)bytetoalloc/sSysInfo.dwPageSize;
  8.  
  9.   lpvBuffer = VirtualAlloc(NULL, (SIZE_T)num_pages*sSysInfo.dwPageSize, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE);
  10.   if (lpvBuffer == NULL )
  11.   {
  12.     AfxMessageBox(_T("Impossibile Allocare!"));
  13.     return FALSE;
  14.   }
  15.        
  16.   return TRUE;
  17. }



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ì:
Codice sorgente - presumibilmente C/C++

  1. CFileException e;
  2. CFile filePR;
  3. UINT bytetoalloc;
  4. LPVOID lpvBuffer = NULL;
  5.  
  6. if (filePR.Open(fd.GetPathName(), CFile::modeReadWrite ,&e))
  7. {
  8.   bytetoalloc = (UINT) filePR.GetLength();
  9.   if (CreateBuffer(bytetoalloc, lpvBuffer))
  10.   {
  11.     if(filePR.Read(lpvBuffer, bytetoalloc))
  12.     {
  13.       .......
  14.     }
  15.   }
  16. }


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 il 02/12/2007 alle 23:04
PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 7:57
Lunedì, 03/12/2007
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

Codice sorgente - presumibilmente Python

  1. char *buff;
  2.  
  3.    if(!(buff=(char *)malloc(26000000)))
  4.    {
  5.       printf("Errore durante l'allocazione del buffer\n");
  6.       return 1;
  7.    }
  8.        
  9.    /* lettura del file */
  10.  
  11.    free(buff);
  12.  
  13.    return 0;



oppure del C++

Codice sorgente - presumibilmente C++

  1. char *buff;
  2.  
  3.    try
  4.    {
  5.       buff = new char[26000000];
  6.    }
  7.    catch(std::bad_alloc)
  8.    {
  9.       cout << "Errore durante l'allocazione del buffer" << endl;
  10.       return 1;
  11.    }
  12.  
  13.    // lettura del file
  14.  
  15.    delete buff;
  16.  
  17.    return 0;


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 14:12
Lunedì, 03/12/2007
Testo quotato

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: https://piero.dev
PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 14:27
Lunedì, 03/12/2007
Sorry. Non lo sapevo.

PM Quote