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.