Visualizzazione dei risultati da 1 a 10 su 17

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    171
    ciao, grazie mille per la tua risposta.
    riporto la traccia cosi da essere piu chiaro.

    implementare l'insertion sort , algoritmo va implementato in modo tale da poter essere utilizzato su un generico tipo T.
    il file csv contiene 20000000 di record, il file
    contiene i seguenti campi:
    ● id: (tipo intero) identificatore univoco del record;
    ● field1: (tipo stringa) contiene parole estratte dalla divina commedia, potete assumere che i valorinon contengano spazi o virgole;● field2: (tipo intero);
    ● field3: (tipo floating point);

    si ordinino i dati contenuti nel file csv inordine non decrescente secondo i valori contenuti nei tre campi "field" ( ripetere l'ordinamento tre volte, una volta per ciascun campo).


    quello che ho bisogno di capire e come strutturare l'implementazione ? conviene creare una classe dove inserisco i dati e poi inserisco un oggetto nell arraylist ?
    non ha seso usare l'arraylist ?

    come mi consiglieresti di procedere.

    grazie ancora

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da processore Visualizza il messaggio
    il file csv contiene 20000000 di record
    Se non hai scritto errato ... 20 milioni di record sono tanti, ma proprio TANTI. Assicurati di avere abbastanza heap space sufficiente per la applicazione Java (ad occhio, almeno 1 GByte di heap, se non di più).

    Quote Originariamente inviata da processore Visualizza il messaggio
    conviene creare una classe dove inserisco i dati
    Sì. Una classe es .... Record. (detto così, senza sapere meglio il senso, significato, del record)

    Quote Originariamente inviata da processore Visualizza il messaggio
    e poi inserisco un oggetto nell arraylist ?


    Quote Originariamente inviata da processore Visualizza il messaggio
    non ha seso usare l'arraylist ?
    Non ho capito il senso del dubbio. Comunque sì, ha senso usare ArrayList.
    Ultima modifica di andbin; 08-06-2016 a 22:57
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    171
    ciao, si sono 20 milioni di record.
    io ho provato a fare cosi e lo ordina metto il codice sotto.

    il problema è che non riesco a farlo con i tipi generici.
    mi potresti dare una mano per capire come funzionano i tipi generici ?

    grazie mille

    codice:
    package sort;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.util.ArrayList;
    
    
    public class mainSort {
    
    
    	public static void main(String[] args) {
    		
    		try{
    			ArrayList<records> lista = new ArrayList<records>();
    												
    			FileReader input = new FileReader("C:/file.csv");
    			BufferedReader f = new BufferedReader(input); 
    			
    			String linea ;
    			int i = 0;
    			
    			while((linea = f.readLine()) != null){
    				
    				int id = Integer.parseInt(linea.split(",")[0]);
    				String field1 = linea.split(",")[1];
    				int field2 = Integer.parseInt(linea.split(",")[2]);
    				float field3 = Float.parseFloat(linea.split(",")[3]);
    				
    				lista.add(new records(id, field1, field2, field3 ));
    				System.out.println(i++);
    			}
    			
    			f.close();
    						
    			insertionSort s = new insertionSort(lista);
    			
    			s.sort();
    			
    			for(records p: s.getInputList()){
    				System.out.println(p.getField2());
    			}
    
    
    		}
    		catch(Exception e){
    			System.out.println("verificato un errore");
    		}
    		
    
    
    	}
    
    
    }
    codice:
    package sort;
    
    
    import java.util.ArrayList;
    
    
    public class insertionSort {
    
    
    	private ArrayList<records> inputList = new ArrayList<records>();
    	
    	public ArrayList <records> getInputList() {
            return inputList;
        }
    	
    	
    	
    	//costruttore
    	//tramite il costruttore passiamo a insertionSort la lista
    	public insertionSort(ArrayList<records> input){
    		
    		this.inputList = input;
    		
    	}
    	
    	
    	
    	public void sort (){
    				
    		records tmp ;
    		
    		for(int i=1; i< inputList.size(); i++){
    			
    			for(int j = i; j>0; j--){
    				
    				int key = inputList.get(j).getField2();
    				
    				if(key < inputList.get(j-1).getField2()){
    					
    					tmp = inputList.get(j);
    					
    					inputList.set(j, inputList.get(j-1));
    					inputList.set(j-1, tmp);
    					
    				}
    				
    			}
    			
    		}
    		
    				
    				
    	}
    	
    	
    	
    }
    codice:
    package sort;
    
    
    public class records {
    	
    	private int id;
    	private String field1;
    	private int field2;
    	private float field3;
    	
    	public records(int id, String field1, int field2, float field3){
    		this.id = id;
    		this.field1 = field1;
    		this.field2 = field2;
    		this.field3 = field3;
    		
    	}
    	
    	public int getId(){
    		return id;
    	}
    	
    	public String getField1(){
    		return field1;
    	}
    	
    	public int getField2(){
    		return field2;
    	}
    	
    	public float getField3(){
    		return field3;
    	}
    	
    	
    
    
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da processore Visualizza il messaggio
    ciao, si sono 20 milioni di record.
    Allora ribadisco che una cosa a cui dovrai sicuramente prestare attenzione è il dimensionamento del heap space, perché altrimenti la applicazione ti andrà in crash molto velocemente.

    Quote Originariamente inviata da processore Visualizza il messaggio
    il problema è che non riesco a farlo con i tipi generici.
    mi potresti dare una mano per capire come funzionano i tipi generici ?
    Prima, se permetti, alcune questioni più fondamentali, ovvero sulle denominazioni. I nomi di classi dovrebbero iniziare con la maiuscola, quindi InsertionSort invece che insertionSort. E poi Record invece che records. Nota che la tua classe del record modella 1 record, non N. Quindi non è granché appropriato chiamarla records.

    Poi il tuo metodo sort() non mi pare che sia un "insertion sort". Gli algoritmi di ordinamento generalmente non li si "inventa" (ce ne sono già anche troppi). Basta cercare informazioni su uno specifico, es. https://it.wikipedia.org/wiki/Insertion_sort
    E seguire il concetto/algoritmo.

    Riguardo il criterio di ordinamento in effetti ci sono diverse strade. Tu hai più criteri di ordinamento, come dicevi prima: "ripetere l'ordinamento tre volte, una volta per ciascun campo".
    Ora: o replichi l'algoritmo più volte, incapsulando il criterio di ordinamento dentro l'algoritmo (come stavi facendo) oppure puoi cercare di generalizzarlo, esattamente come fanno i sort del framework.

    Il framework ha Arrays.sort() e Collections.sort() (non usa insertion sort ma un altro algoritmo). Questi sort implementano SOLO l'algoritmo di ordinamento ma il criterio di comparazione è delegato agli oggetti stessi da ordinare (se implementano Comparable) oppure ad un Comparator esterno.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se non hai scritto errato ... 20 milioni di record sono tanti, ma proprio TANTI. Assicurati di avere abbastanza heap space sufficiente per la applicazione Java (ad occhio, almeno 1 GByte di heap, se non di più).
    Ciao,
    mi inserisco in questa discussione in quanto ho un problema simile,
    dovrei leggere anch'io un file csv di grandi dimensioni ed il programma mi va in eccezione (per overflow: java.lang.OutOfMemoryError: Java heap space) tra le 15 e le 20 milioni di righe lette.

    Immagino di dover settare la dimensione dello heap, potresti dirmi come? E' possibile farlo a runtime?

    In alternativa/aggiunta è possibile ottimizzare la lettura del file?
    Al momento utilizzo BufferReader, splitto la riga csv in un'array di stringhe che passo al costruttore dell'oggetto Row, creato ad hoc che si occupa di effettuare il parsing dei vari valori.
    Esiste un oggetto "più efficiente/parsimonioso" per leggere da file?

    Ti ringrazio in anticipo...
    Ultima modifica di Mrk31; 13-06-2016 a 09:57

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Immagino di dover settare la dimensione dello heap, potresti dirmi come? E' possibile farlo a runtime?
    A "runtime" (cioè dopo che la applicazione è già stata avviata) no. Solo nel momento in cui avvii la JVM.

    java -Xmx800m .....blabla......

    (per 800 MByte di heap massimo)

    Vedi documentazione comando java

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    In alternativa/aggiunta è possibile ottimizzare la lettura del file?
    Al momento utilizzo BufferReader, splitto la riga csv in un'array di stringhe che passo al costruttore dell'oggetto Row, creato ad hoc che si occupa di effettuare il parsing dei vari valori.
    Esiste un oggetto "più efficiente/parsimonioso" per leggere da file?
    Bisognerebbe vedere in dettaglio i dati e il tuo codice. Così come l'hai detto, non mi pare male ma ripeto, bisognerebbe vedere i dettagli.
    Diciamo che se ci sono tantissimi dati uguali, es. ci sono 50000 righe dove in un campo c'è scritto "pippo", a runtime terrai referenziati 50000 oggetti String distinti con lo stesso contenuto. Si potrebbe pensare di realizzare un sistema di "pooling" degli oggetti. Che è applicabile in generale per tutti gli oggetti "immutabili" (String, Integer, ecc...).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    A "runtime" (cio� dopo che la applicazione � gi� stata avviata) no. Solo nel momento in cui avvii la JVM.

    java -Xmx800m .....blabla......

    (per 800 MByte di heap massimo)

    Vedi documentazione comando java

    Ok, grazie. Ho cotrollato dovrebbe essere cosi':
    -Xmx --> Dimensione Massima Heap
    -Xms --> Dimensione di partenza Heap
    Posso anche specificare l'unita' di misura:
    k --> KB
    m --> MB
    g --> GB

    Ho fatto un paio di prove e subito penso di averla diminuita, perche' mi va in overflow prima
    Cercando in giro l'ide (sto usando netbeans) dovrebbe settare l'heap di default ad 1/3 o 1/4 della ram del PC. Nel mio caso (8GB) dovrebbe quindi essere gia' di 2gb o 2,66Gb...

    Possibile che un file di 700-800mb richieda piu' di 2gb in RAM???
    Ultima modifica di Mrk31; 13-06-2016 a 14:26

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mrk31 Visualizza il messaggio

    Ok, grazie. Ho cotrollato dovrebbe essere cosi':
    -Xmx --> Dimensione Massima Heap
    -Xms --> Dimensione di partenza Heap
    Posso anche specificare l'unita' di misura:
    k --> KB
    m --> MB
    g --> GB
    Sì k/m/g minuscolo o maiuscolo. E g/G da quanto so è disponibile solo da Java 8 (già nella documentazione di Java 7 non è indicato).

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Ho fatto un paio di prove e subito penso di averla diminuita, perche' mi va in overflow prima
    Cercando in giro l'ide (sto usando netbeans) dovrebbe settare l'heap di default ad 1/3 o 1/4 della ram del PC. Nel mio caso (8GB) dovrebbe quindi essere gia' di 2gb o 2,66Gb...
    Non conosco/uso normalmente NetBeans ma chiaramente questa impostazione la devi mettere o sulla configurazione di launch specifica del progetto oppure sul Runtime Environment configurato globalmente nel IDE (almeno per Eclipse le opzioni possibili sono così).

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Possibile che un file di 700-800mb richieda piu' di 2gb in RAM???
    Sì, assolutamente è possibile! Conta quanti oggetti hai, conta quanto occupano gli oggetti (es. devi sapere come è fatto String all'interno) e potrai farti una idea ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Sì k/m/g minuscolo o maiuscolo. E g/G da quanto so è disponibile solo da Java 8 (già nella documentazione di Java 7 non è indicato).


    Non conosco/uso normalmente NetBeans ma chiaramente questa impostazione la devi mettere o sulla configurazione di launch specifica del progetto oppure sul Runtime Environment configurato globalmente nel IDE (almeno per Eclipse le opzioni possibili sono così).


    Sì, assolutamente è possibile! Conta quanti oggetti hai, conta quanto occupano gli oggetti (es. devi sapere come è fatto String all'interno) e potrai farti una idea ...
    dunque per il momento sono arrivato a 3gb di partenza e 5 max e continua ad andare in overflow (fa i primi 15milioni abbastanza in fretta poi ci mette una vita!!!)...

    Dato che una volta "caricati" in RAM quei dati devo ancora manipolarli devo cercare in qualche modo di "risparmiare" spazio...

    Penso di "sprecarne" parecchio in "travasi" da un tipo di dato all'altro...
    - Leggo la Linea come stringa (dato1,dato2,dato3, ecc)
    - Splitto la linea in un'array di stringhe
    - Passo l'array di stringhe al costruttore del mio oggetto "Row"
    - Il costruttore effettua il Cast al tipo corretto di ogni datoX...
    Anche se immagino che in tutto ciò intervenga il GarbageColletor???

    L'ideale sarebbe avere un oggetto "Lettore" che mi resituisca i tipi giusti, come per jdbc un rs.getInt, rs.getBoolean, ecc...

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.