Le librerie Apache POI lavorano sulla RAM

di il
32 risposte

Le librerie Apache POI lavorano sulla RAM

Ciao a tutti, sto studiando le librerie Apache POI e ho creato dei metodi interessanti ma ho dei problemi di fondo insormontabili. Quando scrivo su un file una grande mole di dati le librerie riempiono la RAM ed il software si blocca. Esiste una soluzione a questo problema oppure mi devo accontentare di scrivere piccole matrici?

32 Risposte

  • Re: Le librerie Apache POI lavorano sulla RAM

    Mi pare che nel thread

    https://www.iprogrammatori.it/forum-programmazione/java/rendere-metodo-generic-t16421-15.html#p8492842

    si fosse già discusso il problema ...
  • Re: Le librerie Apache POI lavorano sulla RAM

    Si ma non risolto. Ho pensato di aprire una nuova discussione perché il problema affrontato era off-topic.

    Non c'è un sistema per dire a java di usare il disco quando manca la ram?
  • Re: Le librerie Apache POI lavorano sulla RAM

    Tutto ciò che è in esecuzione sta sulla RAM..puoi però gestire "manualmente" questo aspetto ad esempio utilizzando dei file e leggendone solo alcune porzioni alla volta..
  • Re: Le librerie Apache POI lavorano sulla RAM

    Ho provato ad aggiungere un valore nella cella (r=200000,c=0) in un file contenente già 199999 righe (r) creato con altro programma ma si pianta ugualmente. Credo che lui carichi in ram tutto il contenuto del file + il valore di mio interesse e poi riscriva tutto. Non si può dire a java:

    "usa la ram disponibile e quanto ne resta libera il 10% comincia ad usare l'hard disk..."

  • Re: Le librerie Apache POI lavorano sulla RAM

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at java.util.Arrays.copyOfRange(Unknown Source)
    	at java.lang.String.<init>(Unknown Source)
  • Re: Le librerie Apache POI lavorano sulla RAM

    Vedi la gestione dell'heap di cui ti ho già parlato (e con cui eri riuscito a migliorare il comportamento del programma).
  • Re: Le librerie Apache POI lavorano sulla RAM

    Si, ho visto la gestione dell'heap e ti ringrazio per il consiglio, ma ho trovato dei comandi che hanno come unico sistema quello di aumentare la ram disponibile, non ad esempio di usare l'hard disk come risorsa di memoria. Con la gestione dell'heap posso infatti processare matrici più grandi ma ho comunque un limite: la quantità di ram del mio pc. Inoltre tu parli di gestione dell'heap ma alla fine io ho trovato solo questo comando:

    -Xms256m -Xmx3584m

    mica molti altri, quindi oserei dire che è un po' eccessivo parlare di gestione, sempre che non esistano altri strumenti, in tal caso illuminami.
  • Re: Le librerie Apache POI lavorano sulla RAM

    Esattamente quelli....
    devi aumentarli:

    -Xms512m -Xmx4096m
  • Re: Le librerie Apache POI lavorano sulla RAM

    Ho già anche provato a mettere -Xmx32768m ma mi si è inchiodato il sistema! Penso che sul mio windows 8 il massimo sia -Xmx4096m dato che ho 4GB di ram, dico bene oppure ritenete che il sistema sia diventato instabile per altri motivi è dovrei riprovare?

    A presto
  • Re: Le librerie Apache POI lavorano sulla RAM

    Ci credo che è diventato instabile
    Si effettivamente ritengo che dovresti formattare tutto.....
    Scherzo
    Non so dovresti un po vedere te come superare questo scoglio.
  • Re: Le librerie Apache POI lavorano sulla RAM

    schumy2000 ha scritto:


    Ci credo che è diventato instabile
    Si effettivamente ritengo che dovresti formattare tutto.....
    Scherzo
    Non so dovresti un po vedere te come superare questo scoglio.
    Ma non eravate voi gli esperti?



    Comunque ho detto una cavolata... Se setto 32 gb il sistema diventa lento (10 secondi per aprire una finestra) ma non si inchioda. Oggi ho lasciato il pc acceso diverse ore e ha continuato a macinare all'infinito però non è arrivato ad una soluzione... quindi deduco che le tanto famigerate librerie Apache POI osannate e straosannate sono delle emerite ciofeche... oltretutto bisogna pure maledire il linguaggio per riuscire a tabulare in un array il contenuto di un foglio... bah... io opterei per altre librerie ma quali? C'è un sistema per scrivere (-Xms256m -Xmx3584m) dentro il codice del programma e fare in modo che quando si raggiunge il massimo della memoria prima di incominciare a scrivere sull'hard disk si fermi?
  • Re: Le librerie Apache POI lavorano sulla RAM

    peruzzo ha scritto:


    schumy2000 ha scritto:


    Ma non eravate voi gli esperti?
    Essere esperto non vuol dire fare i miracoli ...

    Se questo è il limite di quella libreria e del runtime, vuol dire che ci devi mettere qualcosa di tuo per risolvere il problema. Tutto qui.

    Per fare quello che chiedi probabilmente devi lavorare per parti, creando piccoli array da scrivere uno dopo l'altro nel foglio. Non pretendere di creare milioni di elementi da trattare tutti insieme perché non lo potrai fare con nessuna libreria, nessun linguaggio e nessun computer.
  • Re: Le librerie Apache POI lavorano sulla RAM

    Ho provato questo codice:
    public static void main(String[] args) {
    		Double[][] datiLim = new Double[10][10];
    		for (int i = 0; i < datiLim.length; i++) {
    			for (int j = 0; j < datiLim[0].length; j++) {
    				datiLim[i][j] = (double) (i - j);
    			}
    		}
    		int i;
    		int j;
    		Double[][] inserisci = new Double[1][datiLim[0].length];
    		xlswrite("32GB.xlsx", inserisci, 0, 0, false);
    		for (i = 0; i < datiLim.length; i++) {
    			for (j = 0; j < datiLim[0].length; j++) {
    				inserisci[0][j] = datiLim[i][j];
    			}
    			xlswrite("32GB.xlsx", inserisci, i, 0, true);
    		}
    		System.out.println("Scrittura eseguita con successo!");
    	}
    }
    prima con una matrice 10x10 poi sempre più grande ed il risultato è stato peggiorativo...



    Con apache poi se si vuole aggiungere in steep diversi valori sulla stessa riga non è possibile:
    Cell cell = row.createCell(cellnum++);
    perché il .jar importato scrive solo l'ultimo valore e cancella i precedenti... bah... ho capito perché sono gratis... ma non è colpa vostra, queste librerie mi sono state consigliate su html.it da qualcuno che non le aveva MAI usate... ci scommetto!

    avete altre idee?
  • Re: Le librerie Apache POI lavorano sulla RAM

    ripeto la domanda:

    C'è un sistema per scrivere (-Xms256m -Xmx3584m) dentro il codice del programma e fare in modo che quando si raggiunge il massimo della memoria consentita il programma si chiuda scrivendo sul video "Memoria esaurita"?

Devi accedere o registrarti per scrivere nel forum
32 risposte