Rendere un metodo generic

di il
24 risposte

24 Risposte - Pagina 2

  • Re: Rendere un metodo generic

    Sto provando il metodo scrivi_su_file_xls() da me creato ma c'è una delusione immensa... Si possono scrivere solo file con max 17000 righe e 50 colonne (800000 valori) su un pc con 2 core e 4 gb di ram. Questo limite risiede nelle librerie Apache POI oppure nell'uso degli oggetti (Double, Integer, ecc...) al posto dei tipi primitivi?
    Se scrivo a pezzi il file non funziona, mi da questo errore sempre e comunque quando supero il numero delle righe:
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.io.ByteArrayOutputStream.grow(Unknown Source)
    at java.io.ByteArrayOutputStream.ensureCapacity(Unknown Source)
    at java.io.ByteArrayOutputStream.write(Unknown Source)
    at org.apache.poi.openxml4j.opc.internal.MemoryPackagePartOutputStream.write(MemoryPackagePartOutputStream.java:88)
    at org.apache.xmlbeans.impl.store.Cursor._save(Cursor.java:590)
    at org.apache.xmlbeans.impl.store.Cursor.save(Cursor.java:2544)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.save(XmlObjectBase.java:209)
    at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:2695)
    at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:2655)
    at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:313)
    at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:317)
    at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:173)

    ecc...
  • Re: Rendere un metodo generic

    Il problema è legato a Java in se. Praticamente La jvm riserva una quantità di memoria pari a 246 MB mi pare, e tu la saturi per cui ti viene lanciata l'eccezione!
    Forse non gestisci in maniera ottimale le risorse (è un'ipotesi)?
  • Re: Rendere un metodo generic

    Si è possibile! C'è un sistema per dire a java se di usare tutta la memoria che vuole?
  • Re: Rendere un metodo generic

    Cerca su google :

    java heap size
  • Re: Rendere un metodo generic

    Ho provato ad aggiungere il codice in eclipse come consigliato in questa pagina:

    http://www.appuntisoftware.it/come-dimensionare-lheap-size-di-unapplicazione-java/

    ma non c'è nulla fare, questa libreria (o java) fa davvero cagare...

    con matlab riesco a creare file molto più grandi, questo codice qui sotto genera una matrice 100000x100 di ben 41,7 MB!
    clear all
    filename = 'testdata.xlsx';
    N=100000;
    M=100;
     for R = 1:N
    for C = 1:M
    A(R,C) = R-C;
    end
    end
    xlswrite(filename,A)
  • Re: Rendere un metodo generic

    Con quel codice Matlab prepari un semplice array numerico che scrivi in un file Excel.

    La libreria Java, invece, tratta in memoria array di oggetti equivalenti a celle di Excel.

    E' facile capire per tutti che è un'altra cosa.

    In ogni caso, le cose cambiano con valori diversi impostati per l'heap?
  • Re: Rendere un metodo generic

    Si, noto miglioramenti ma resto comunque anni luce distante dall'antagonista. Vado ad aprire una discussione nella sezione Matlab e chiedo se qualcuno è in grado di convertire in .jar quel supermetodo così riesco a risolvere. Sulla mia versione ci sono delle funzioni per esportare codice...
  • Re: Rendere un metodo generic

    Non ha senso parlare di "conversione in java" (o in altro linguaggio) di un metodo di Matlab ... più volte ti è stato detto ...
  • Re: Rendere un metodo generic

    Ma Matlab è una fonte di metodi e ha un software molto usato che permette di esportare codice! Matlab non è C++ e poi le Apache POI fanno cagare!
  • Re: Rendere un metodo generic

    Inoltre non capisco perché spezzettando le scritture non riesco a creare xls capienti come Matlab... Ecco il codice:
    Double[][] datiLim = new Double[100000][100];
    		for (int i = 0; i < datiLim.length; i++) {
    			for (int j = 0; j < datiLim[0].length; j++) {
    				datiLim[i][j] =  (double) (i-j);
    			}
    		}
    		int x = 0;
    		Double[][] a = new Double[10000][100];
    		for (int i = 0; i < a.length; i++) {
    			for (int j = 0; j < a[0].length; j++) {
    				a[i][j] =  datiLim[i][j];
    			}
    		}
    		x = x + a.length;
    		xlswrite("superfoglio.xlsx", a);
    		a = new Double[1][1];
    		Double[][] b = new Double[10000][100];
    		for (int i = 0; i < b.length; i++) {
    			for (int j = 0; j < b[0].length; j++) {
    				b[i][j] =  datiLim[i+x][j];
    			}
    		}
    		xlswrite("superfoglio.xlsx", b,x,0,true);
    		x = x + b.length;
    		b = new Double[1][1];
    		Double[][] c = new Double[10000][100];
    		for (int i = 0; i < c.length; i++) {
    			for (int j = 0; j < c[0].length; j++) {
    				c[i][j] =  datiLim[i+x][j];
    			}
    		}
    		xlswrite("superfoglio.xlsx", c,x,0,true);
    		x = x + c.length;
    		c = new Double[1][1];
    		Double[][] d = new Double[10000][100];
    		for (int i = 0; i < d.length; i++) {
    			for (int j = 0; j < d[0].length; j++) {
    				d[i][j] =  datiLim[i+x][j];
    			}
    		}
    		xlswrite("superfoglio.xlsx", d,x,0,true);
    		x = x + d.length;
    		d = new Double[1][1];
    In teoria dopo ogni scrittura dovrebbe liberare memoria ma non è così... credo che apache poi carichi ogni volta in memoria il contenuto del file .xls...
Devi accedere o registrarti per scrivere nel forum
24 risposte