Gestione memoria con file riempito da esecuzione

di il
4 risposte

Gestione memoria con file riempito da esecuzione

Buongiorno, come da titolo sto cercando un modo di gestire un ciclo che alloca in fase di esecuzione, n elementi generati casualmente all'interno di un file.
In particolare, se dico al programma in fase di esecuzione di inserire ad esempio n = 100000000 di elementi, il ciclo inizia, il SO mi comunica che ho esaurito lo spazio su disco (sì, ho fatto una partizione un po'piccola per il mio Linux), e il ciclo non termina.
Cerco quindi un modo per bloccare il ciclo che inserisce dati in automatico nel momento in cui la memoria viene esaurita e che quindi permette di continuare l'esecuzione del programma.
Ecco il codice:

for (i = 1; i <= n; i++)
{
     casualeaa = 1950 + rand() % 70;
     casualemm = 1 + rand() % 12;
     casualegg = 1 + rand() % 31;
     casualehh = rand() % 25;
     rilevazione = (casualeaa * 10 * 10 * 10 * 10 * 10 * 10) + (casualemm * 10 * 10 * 10 * 10) + (casualegg * 10 * 10) + casualehh;
     fprintf(dati, "\n%10ld\t", rilevazione);
     casualegasintero = rand() % 100;
     casualegasdecimale = rand() % 100;
     gas = (double)casualegasintero + (casualegasdecimale/100); 
     fprintf(dati, "%2.2f\t", gas);
     casualeelettricitaintero = rand() % 100;
     casualeelettricitadecimale = rand() % 100;
     elettricita = (double)casualeelettricitaintero + (casualeelettricitadecimale/100);                  
     fprintf(dati, "%2.2f\t", elettricita);
}
Grazie in anticipo dell'aiuto

4 Risposte

  • Re: Gestione memoria con file riempito da esecuzione

    Fprintf ha un return value negativo in caso di errore,
    anche il return value di fflush diverso da zero indica un errore.

    In ogni caso, se non è un esercizio meramente accademico ma stai progettando un sistema di log, rivedrei l'impianto generale
  • Re: Gestione memoria con file riempito da esecuzione

    Inoltre sarebbe buona norma, prima di scrivere un file grande, di vedere se c'è spazio sul disco!
  • Re: Gestione memoria con file riempito da esecuzione

    Grazie a entrambi per le risposte.

    No il file è un test che calcola la complessità di funzioni che lavorano su quei dati, quindi ho bisogno di un file grande che testi l'andamento asintotico.
    Quindi basterebbe che come condizione di terminazione del ciclo metta un fprint != -1?
    Come potrei fare a vedere se c'è spazio su disco durante l'esecuzione del programma (cioè una funzione che mi dice, ancora prima di scrivere i dati su file, se ci sarà o meno spazio e quindi in base a ciò andrà a scrivere su file o chiederà all'utente di inserire un altro valore)?
  • Re: Gestione memoria con file riempito da esecuzione

    nicosanti98 ha scritto:


    No il file è un test che calcola la complessità di funzioni che lavorano su quei dati, quindi ho bisogno di un file grande che testi l'andamento asintotico.
    Quindi basterebbe che come condizione di terminazione del ciclo metta un fprint != -1?
    Come potrei fare a vedere se c'è spazio su disco durante l'esecuzione del programma (cioè una funzione che mi dice, ancora prima di scrivere i dati su file, se ci sarà o meno spazio e quindi in base a ciò andrà a scrivere su file o chiederà all'utente di inserire un altro valore)?
    1) ho detto che l'errore c'è se fprintf è negativo, non se è diverso da -1
    2) no che non basta, va in errore anche se il return value di fflush è diverso da zero. Lo usi fflush da qualche parte, visto che hai un file grosso, giusto?
    3) Sotto Linux le funzioni dovrebbero essere fstatvfs e fstatvfs64 che ti caricano una struttura con il numero di blocchi liberi. Sicuro che ne hai davvero bisogno? Quanto è grossa la tua partizione? Quanto è la dimensione massima del file singolo supportata dal tuo file system? Non è che per caso hai raggiunto il limite di 2 o 4 GB?
Devi accedere o registrarti per scrivere nel forum
4 risposte