Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568

    [java] split file grosse dimensioni

    ciao a tuti...
    ho realizatto un programmino che apre un file di testo, lo splitta riga per riga, cerca in ogni riga se è presente una determinata stringa e se presente la riporta in una textarea...

    funziona tutto... il problema si presenta su file di testo di grosse dimensioni.. tipo 50000 righe...
    ci mette una vita !!!

    avete consigli ???

    riporto il codice del metodo che cerca la traccia...

    codice:
    	private void cercaTraccia(){
    		
    		// INIZIALIZZO RISULTATI RICERCA
    		String risultatiRicerca = "";
    		
    		// SVUOTO LA TEXT AREA
    		jTextArea_RisultatiRicerca.setText("");
    		
    		// RECUPERO LA TRACCIA
    		String traccia = jTextField_RicercaTraccia.getText();
    		
    		// LETTURA DEL FILE
    		String fileContent = "";
    		FileHelper fileHelper = new FileHelper(); 
    		try {
    			fileContent = fileHelper.read(jTextField_PathFile.getText());
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    		// PREPARO I PARAMETRI PER LA RICERCA
    		String [] parametriDaCercare;
    		if(jCheckBox_Concatena.isSelected() == false){
    			parametriDaCercare = new String[1];
    			parametriDaCercare[0] = traccia;
    		}else{ // SE HO PIù PAROLE DA CERCARE
    			StringTokenizer st1 = new StringTokenizer(traccia, "+");
    			parametriDaCercare = new String[st1.countTokens()];
    			int i = 0;
    			while (st1.hasMoreTokens()) {
    				parametriDaCercare[i] = (st1.nextToken().trim());
    				i++;	
    			}
    		}
    
    		// RICERCA TRACCIA PER OGNI RIGA DEL LOG
    		boolean rigaDaAggiungere = false;
    		StringTokenizer st2 = new StringTokenizer(fileContent,"\n");
    		String riga = "";
    		while (st2.hasMoreTokens()) {
    			
    			// RECUPERO LA RIGA DI TESTO DEL LOG
    			riga = st2.nextToken();
    			
    			// PER OGNI VOCE DELLA TRACCIA
    			for(int index_ricerca = 0;index_ricerca<parametriDaCercare.length;index_ricerca++){
    				
    				// DICHIARO CHE NON DEVE AGGIUNGERE LA RIGA
    				rigaDaAggiungere = false;
    				
    				// CONTROLLO SE RICERCA NO CASE SENSITIVE
    				if(jCheckBox_CaseSensitive.isSelected() == false){
    					
    					// CONTROLLO SE TROVA LA TRACCIA NO CASE SENSITIVE
    					if(riga.toUpperCase().indexOf(parametriDaCercare[index_ricerca].toUpperCase()) >= 0){
    						// SE NON DEVE CERCARE TUTTI I TERMINI AGGIUNGE LA RIGA ED ESCE DAL CICLO
    						if(jCheckBox_CercaTutto.isSelected() == false){
    							rigaDaAggiungere = true;
    							break;
    						}else{
    							rigaDaAggiungere = true;
    						}
    					}else{ // SE NON TROVA LA TRACCIA
    						// SE DEVE CERCARE TUTTI I TERMINI NON AGGIUNGE LA RIGA ED ESCE DAL CICLO
    						if(jCheckBox_CercaTutto.isSelected()==true){
    							rigaDaAggiungere = false;
    							break;
    						}
    					} // FINE CONTROLLO SE TROVA LA TRACCIA NO CASE SENSITIVE
    					
    				}else{ // SE LA RICERCA TRACCIA CASE SENSITIVE
    					
    					// CONTROLLO SE TROVA LA TRACCIA
    					if(riga.indexOf(parametriDaCercare[index_ricerca]) >= 0){
    						// SE NON DEVE CERCARE TUTTI I TERMINI AGGIUNGE LA RIGA ED ESCE DAL CICLO
    						if(jCheckBox_CercaTutto.isSelected()==false){
    							rigaDaAggiungere = true;
    							break;
    						}else{
    							rigaDaAggiungere = true;
    						}
    					}else{ // SE NON TROVA LA TRACCIA
    						// SE DEVE CERCARE TUTTI I TERMINI NON AGGIUNGE LA RIGA ED ESCE DAL CICLO
    						if(jCheckBox_CercaTutto.isSelected()==true){
    							rigaDaAggiungere = false;
    							break;
    						}
    					} // FINE CONTROLLO SE TROVA LA TRACCIA NO CASE SENSITIVE
    
    				} // FINE CONTROLLO CASE SENSITIVE
    				
    			} // FINE CICLO PER OGNI VOCE DELLA TRACCIA
    			
    			// CONTROLLO SE LA RIGA è DA AGGIUNGERE O NO
    			if (rigaDaAggiungere==true){
    				
    				System.out.println(riga);
    				risultatiRicerca = risultatiRicerca + (riga + "\n");
    
    			}
    
    		} // FINE CICLO PER OGNI RIGA
    		
    		jTextArea_RisultatiRicerca.setText(risultatiRicerca);
    		
    	}
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Potresti provare con RandomAccessFile e leggere una porzione di file alla volta (skippando con seek). Dovresti però pensare ad un modo per leggere le righe per intero (nel senso che se skippy 50000 bytes e finisci in mezzo ad una riga dovresti cominciare la lettura dal fine riga precedente e idem per la posizione di arresto di lettura)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    scusa ma non ho capito...
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Come apri il file? Se usi RandomAccessFile per accedere al file puoi decidere quanto leggerne e da che punto. In altre parole, decidi una dimensione, 100KB per esempio, e leggi 100KB alla volta. Su questi 100KB esegui le tue verifiche.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    lo apro così...

    codice:
    	public static String read(String fileToSend) throws IOException {
    
    		String nextLine = "";
    		String lineSep = System.getProperty("line.separator");
    		FileReader f = new FileReader(fileToSend);
    		BufferedReader br = new BufferedReader(f);
    		StringBuffer sb = new StringBuffer();
    		while((nextLine = br.readLine()) != null) 
    		{
    			sb.append(nextLine);
    			sb.append(lineSep);
    		} // FINE WHILE
    		
    		br.close();
    		f.close();
    		
    		return(sb.toString());
    	}
    e mi sa che è proprio qui che il programma va lento... perchè il semplice controllo index of non mi sembra che crei problemi particolari...
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Originariamente inviato da Andrea1979
    Potresti provare con RandomAccessFile e leggere una porzione di file alla volta (skippando con seek). Dovresti però pensare ad un modo per leggere le righe per intero (nel senso che se skippy 50000 bytes e finisci in mezzo ad una riga dovresti cominciare la lettura dal fine riga precedente e idem per la posizione di arresto di lettura)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    invece no... è proprio quando la stringa su ogni riga.. la lettura è molto veloce specialmente così :

    codice:
    		String fileContent = "";
    		String file = jTextField_PathFile.getText();
    		long start = System.currentTimeMillis();
    		try{
    			ByteArrayOutputStream os = new ByteArrayOutputStream();
    			InputStream is = new FileInputStream(file);
    			byte[] buffer = new byte[1024];// Or some length
    			for (int count = 0; (count = is.read(buffer)) != -1;)
    			    os.write(buffer, 0, count);
    			os.close();
    			is.close();
    			fileContent = os.toString("utf-8"); // or whatever encoding the file is
    		}catch(Exception ie){
    			ie.printStackTrace();
    		}
    		long elapsed = System.currentTimeMillis() - start;
            System.out.println("Tempo impiegato : " + elapsed);
    adesso il problema è la query vera e propria..
    se splitto e faccio riga per riga non mi passa più...

    forse sarebbe meglio cercare su tutto il testo con indexOf e quando trovo la Stringa recuperare l'inizio riga e riportarla nella textArea, proseguendo la ricerca dal punto successivo..

    qualche idea migliore ??? andrea non ho capito il tuo quote !!!
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Se tu apri 50000 righe di file quello si crea un oggetto con 50000 righe e su quelle 50000 righe ogni volta andrà a fare le sue ricerche e operazioni. Il mio suggerimento è: apri 100 righe, fai le tue cose, chiudi, apri le 100 righe successive etc etc.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    capito !!! infatti ora va meglio !!!
    grazie !!!
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    M prego! Vaya con Cornholio!
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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