Visualizzazione dei risultati da 1 a 4 su 4

Discussione: problema out of memory

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    82

    problema out of memory

    Salve a tutti,
    sto leggendo da un file testuale una matrice 50000x50000

    codice:
    while ((row= bufRead.readLine()) != null) 
       { Runtime run = Runtime.getRuntime(); 
          long freeMem = run.freeMemory(); 
          System.out.println("free memory: " + freeMem); 
          riga = row.split("[ ]+");
          .
          .
           //niente che occupi la memoria
         }
    mi aspettavo o che flippasse alla prima riga o mai. Invece riesce ad esaminare più di 2000 righe prima di dare "java.lang.OutOfMemoryError: Java heap space" lanciato sullo split. La dichiarazione della riga è fuori dal ciclo quindi dovrebbe esisterne solo una. Inoltre se come vedete stampo la memoria libera vedo che ce nè ancora molta. é normale quindi che lanci questa eccezione? Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Io sto effettuando delle prove.
    Ho creato un file di testo con 50.000 x 50.000 numeri interi separati da tabulazione (14 GB di file!).
    Ho implementato una lettura con split come la tua e non ottengo alcuna OutOfMemory (del resto, il mio programma è minimale, evidentemente il tuo programma, giustamente, fa uso di altre risorse).

    Una prima ottimizzazione consiste proprio nel portare dentro al while la dichiarazione dell'array: in questo modo il GarbageCollector si accorge "prima" che la memoria occupata da un'iterazione può essere liberata.

    codice:
    String[] riga = null;
    while( ... ) {
       ...
       riga = row.split( ... );
    }
    Con questa soluzione, l'array "riga" non può essere deallocato dopo la prima iterazione poichè, potenzialmente, dovrebbe essere reso disponibile al di fuori del ciclo while. Il GarbageCollector, quindi, non lo può toccare.

    codice:
    while( ... ) {
       ...
       String[] riga = row.split( ... );
    }
    Con questa soluzione, invece, alla fine di ciascun ciclo l'intero array può essere tranquillamente deallocato (non dovendo essere disponibile fuori dal while), di conseguenza il GarbageCollector lo può tranquillamente rimuovere, rendendo disponibile immediatamente la memoria.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    82
    Purtroppo il problema sussiste ma grazie dell'aiuto.
    Dal punto di vista della velocità è meglio dichiarare la variabile dentro il ciclo o fuori? fuori giusto?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da GK4
    Purtroppo il problema sussiste ma grazie dell'aiuto.
    Dal punto di vista della velocità è meglio dichiarare la variabile dentro il ciclo o fuori? fuori giusto?
    Il dove le dichiari non ha alcun impatto sulla "velocità", ma solo sull'occupazione di memoria (che dipende, ovviamente, dallo scope). Ovviamente, il "dove" dichiararle dipende solo ed esclusivamente da ciò che ti serve: ti serve lavorare con l'array dopo l'esecuzione del ciclo while? Non credo... quindi, dichiaralo dentro, in modo che all'uscita vada fuori scope, e il GC lavori bene.

    Secondo me il problema è da qualche altra parte. Prova a postare un po' più di codice ed, eventualmente, prova a utilizzare un profiler.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2025 vBulletin Solutions, Inc. All rights reserved.