Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [C++] probabile limite memoria

    Ciao a tutti,
    sto facendo un esperimento con un array di puntatori ad una struttura:
    codice:
    struct NODO
    {
    	__int64		ByteIniziale;
    	__int64		ByteFinale;
    	char		*ChiaveOrdinamento;
    };
    NODO **Key;
    
    ....
    
    while (!feof(fpi))
    {
    ...
    	ContatoreRecord++;
    	Key=(NODO**)realloc(Key,sizeof(NODO*)*(ContatoreRecord+1));
    	Key[ContatoreRecord]=(NODO*)malloc(sizeof(NODO));
    	Key[ContatoreRecord]->ChiaveOrdinamento=(char*)malloc(sizeof(char)*(LunghezzaChiave+1));
    	Key[ContatoreRecord]->ByteFinale=ContatoreByte;
    	Key[ContatoreRecord]->ByteIniziale=ContatoreByte-i;
    ...
    }
    Per il momento leggo un file e alloco la memoria necessaria per le chiavi di ordinamento.
    Tutto sembra funzionare, in debug vedo i puntatori con valori corretti.

    Il problema è che ad un certo punto (circa al record 110.000 su 200.000) il programma si blocca e da errore, sembra che faccia casino con la memoria.
    La cosa strana è che se elimino un campo dalla struttura NODO per renderla più leggera (per esempio ByteFinale), il programma si blocca più avanti, per esempio al record 130.000. Se elimino anche l'altro campo (ByteIniziale) si blocco intorno al record 150.000.

    Ma soprattutto ecco la coincidenza:
    ovviamente mi aspetto che la memoria occupata cresca in continuazione, quindi tengo d'occhio il taskmanager. In tutti i casi si blocca sempre quando la memoria occupata arriva esattamente a 18.720 kb!!! Per questo se NODO occupa meno memoria riesco a leggere molti più record, ma comunque arrivato a 18.720 kb si blocca!

    Esistono limiti? Non sono pochi 18MB?
    Prima di lunedi non potrò rispondere a nessuno.
    Per chi volesse analizzare + a fondo incollo il programma completo (per ora molto corto, di fatto non fa ancora nulla).

    Grazie!



    codice:
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    
    struct NODO
    {
    	__int64		ByteIniziale;
    	__int64		ByteFinale;
    	char		*ChiaveOrdinamento;
    };
    
    NODO **Key;
    NODO **ptN;
    
    const Inizio=1;
    const Fine=10;
    
    int NumeroDiPassaggi=2;
    
    // 0 = ok
    // 1 = manca file di input
    
    int main(int argc, char *argv[])
    {
    	char *NomeFileInput;
    	FILE *fpi;
    	char *Record, *CharApp;
    	long i;
    	long ContatoreRecord=0;
    	long LunghezzaChiave=Fine-Inizio+1;
    	__int64 ContatoreByte=0;
    
    	Key=(NODO**)malloc(sizeof(NODO*));
    	ptN=Key;
    	CharApp=(char*)malloc(2);
    
    	/*NomeFileInput=(char*)malloc(strlen(argv[1]));
    	strcpy(NomeFileInput,argv[1]);*/
    
    	NomeFileInput=(char*)malloc(strlen("B:\\DATI\\xxx.OUT")+1);
    	strcpy(NomeFileInput,"B:\\DAT\\xxx.OUT");
    
    	fpi=fopen(NomeFileInput,"r");
    	if(fpi==NULL)
    		return 1;
    
    
    	//creo nodi
    
    	while (!feof(fpi))
    	{
    		Record=(char*)malloc(1);
    		i=0;
    		CharApp[0]='\0';
    		while ((CharApp[0]!='\n') && (!feof(fpi)))
    		{
    			i++;
    			ContatoreByte++;
    			fread(CharApp,1,1,fpi);
    			Record=(char*)realloc(Record,sizeof(char)*(i+1));
    			Record[i-1]=CharApp[0];
    		}
    		Record[i]='\0';
    
    		if(!feof(fpi))
    		{
    			ContatoreRecord++;
    			Key=(NODO**)realloc(Key,sizeof(NODO*)*(ContatoreRecord+1));
    			Key[ContatoreRecord]=(NODO*)malloc(sizeof(NODO));
    			Key[ContatoreRecord]->ChiaveOrdinamento=(char*)malloc(sizeof(char)*(LunghezzaChiave+1));
    			Key[ContatoreRecord]->ByteFinale=ContatoreByte;
    			Key[ContatoreRecord]->ByteIniziale=ContatoreByte-i;
    		}
    
    		if(ContatoreRecord%1000==0)
    			printf("%d\n",ContatoreRecord);
    
    		free(Record);
    	}
    	return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    sbagliato forum? qui si parla di .net..

  3. #3
    oups... chiedo scusa.

    Gentile moderatore... mi può spostare?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Ma un esempio del file che leggi lo puoi mostrare?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    giusto....
    non posso mostrarlo perchè si tratta di dati anagrafici sensibili.
    E' un ascii con circa 200.000 record lunghi 520 byte ognuno.
    Pur essendo i record a lunghezza fissa devo gestire il file come se fosse a lunghezza variabile (quindi cerco lo 0d0a) perchè il programma, una volta terminato, deve funzionare su tutti i file ascii.
    In debug i record vengono caricati correttamente uno ad uno nel buffer Record[]

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da Luciano79
    giusto....
    non posso mostrarlo perchè si tratta di dati anagrafici sensibili.
    E' un ascii con circa 200.000 record lunghi 520 byte ognuno.
    Ok ... ma se mostri qualche riga cambiando il contenuto (scrivendoci topolino, pippo, paperino ...) almeno si fa qualche prova ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    scusa, è che per te vista la semplicità del file e visto che il file lo leggo ma non ne guardo ancora il contenuto pensavo fosse un'informazione rindondante.

    Comunque il file potrebbe essere una cosa simile:
    codice:
    12345678901234567890
    12345678901234567890
    ABCDEFGHIJKLMNOPQRST
    PIPPO PLUTO         
    MINNI PAPERINO
    ... ripetuto per 50.000 volte

    ho provato su un altro file totalmente diverso, stesso problema...


  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da Luciano79
    scusa, è che per te vista la semplicità del file e visto che il file lo leggo ma non ne guardo ancora il contenuto pensavo fosse un'informazione rindondante.
    Non e' ridondante perche', per replicare il tuo stesso problema con il tuo codice, e' necessario utilizzare i tuoi stessi dati ...

    Infatti, con l'esempio che mi hai fornito, ripetuto piu' volte, ho eseguito il programma fino a leggere

    990000

    per il ContatoreRecord, senza avere errori ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    azz... quindi potrebbe essere un problema del sistema operativo?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Non credo ... semmai sarei piu' orientato per una "particolare" combinazione di dati letti che (solo con quei dati) crea problemi di scrittura in memoria ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.