Modo più veloce per leggere file di testo riga per riga in Java

Per l’elaborazione del registro la mia applicazione deve leggere il file di testo riga per riga.
Prima ho usato la funzione readLine() di BufferedReader, ma ho letto su internet che BufferedReader è lento quando si legge un file.

Poi ho provato ad usare FileInputStream insieme con un FileChannel e MappedByteBuffer ma in questo caso non c’è alcuna funzione simile a readLine() ho quindi cercare il mio testo per una interruzione di linea e di processo:

    try {
        FileInputStream f = new FileInputStream(file);
        FileChannel ch = f.getChannel( );
        MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0L, ch.size());
        byte[] bytes = new byte[1024];
        int i = 0;
        while (mb.hasRemaining()) {
            byte get = mb.get();
            if(get == '\n') {
                if(ra.run(new String(bytes)))
                    cnt++;
                for(int j = 0; j<=i; j++)
                    bytes[j] = 0;
                i = 0;
            }
            else
                bytes[i++] = get;
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }

So che questo probabilmente non è un buon modo per implementare, ma quando ho appena letto il testo del file in byte è 3 volte più veloce utilizzando BufferedReader, ma chiamare new String(bytes) crea una nuova Stringa e rende il programma ancora più lento, poi quando si utilizza un BufferedReader.

Volevo chiedere che cosa è il modo più veloce per leggere un file di testo riga per riga? Alcuni dicono BufferedReader è l’unica soluzione a questo problema.

P. S.: ra è un’istanza di RunAutomaton da dk.brics.Automa biblioteca.

  • è BufferedReader davvero troppo lento per le vostre esigenze? Probabilmente è uno dei più puliti, più gestibile soluzioni se è necessario il codice in Java.
  • Se BufferedReader è davvero troppo lento per la vostra applicazione, si dovrebbe pensare di non usare java o altri linguaggi gestiti … (Ma dubito sia il caso)
  • Aaron‘s risposta è in procinto di essere cancellato come un link solo rispondere, quindi lo metterò qui come commento: “Controllo questo link fuori. Esso contiene velocità confronto di diversi metodi.”
InformationsquelleAutor Yoni | 2011-04-27



5 Replies
  1. 19

    Dubito assai che BufferedReader sta per causare un sovraccarico del sistema. Aggiungendo il proprio codice è probabile che sia almeno come inefficiente, e molto probabilmente sbagliato troppo.

    Per esempio, nel codice che hai dato tu stai chiamando new String(bytes) che è sempre andando a creare una stringa da 1024 byte, utilizzando la piattaforma di codifica di default… non è una buona idea. Certo, è chiaro che la matrice dopo, ma le corde sono ancora in corso per contenere un sacco di ‘\0’ personaggi, il che significa un sacco di spazio sprecato, a prescindere da tutto il resto. Si dovrebbe almeno limitare la porzione di array di byte della stringa, è stata creata dal (il che significa anche non c’è bisogno di cancellare l’array in seguito).

    Avete effettivamente provato utilizzando BufferedReader e l’ho trovato troppo lento? Di solito si deve scrivere il codice più semplice, per soddisfare i vostri obiettivi prima, e quindi verificare se è abbastanza veloce… soprattutto se l’unico motivo per non farlo è una non meglio specificata ” risorsa “letto su internet”. Mi vuoi tu, per trovare centinaia di esempi di gente che sputa non corretto adempimento suggerimenti? 🙂

    Come alternativa, si potrebbe desiderare di guardare Guava‘s sovraccarico di Files.readLines(), che prende un LineProcessor.

    • Ho provato BufferedReader e l’esecuzione di buono, ma il requisito del programma è quello di essere molto veloce in modo che io sto solo cercando di capire quale soluzione è la più veloce it migliore per il mio attuazione.
    • veloce” è piuttosto vago requisito. Avete anche avere una prova che è BufferedReader che è il collo di bottiglia piuttosto che (molto più probabile) la fisica, la velocità del disco?
    • Se ho letto lo stesso file in byte è 3 volte più veloce utilizzando BufferedReader. Il mio hard disk ha una velocità di circa 150mb/s, mentre il mio programma di lettura 30mb/s.
    • Hmm… che è un po ‘ sorprendente. Quello che codifica stai usando, e qual è la tua macchina spec? Sono in esecuzione nel debugger, o fare qualsiasi altra cosa che potrebbe essere rallentando? Sei uso le stringhe a tutti?
    • Sto usando windows-1258 codifica perché il file contengono vietnamita caratteri. Sto usando le stringhe di trovare una regex-modello in esso. Essi sono dato al RunAutomaton istanza. La mia macchina specifiche: C2D P8700, 4GB di ram DDR2, HD: 500GB(Sata2) 7200 RPM. Io non sono in esecuzione nel debugger e non è per la regex che è lento, perché quando commentando il RunAutomaton la lettura è alla stessa velocità.
    • Sembra che l’unica soluzione idonea è quello di utilizzare un BufferedReader. Perché hai dato la più utile e completa informazione accetto la tua risposta.
    • E ‘ molto strano, per la regex non avere alcun impatto… Una cosa da tenere a mente è che per dispari motivi, la definizione di un Charset è più lento di specificare il nome di una codifica, in modo che potrebbe aiutare.

  2. 2

    Utilizzando una normale BufferedReader ho+ di 100 MB/s. È molto probabile che la velocità è in grado di leggere i dati dal disco è il collo di bottiglia, quindi come si fa la lettura non fare molta differenza.

    BufferedReader non è l’unica soluzione, ma è abbastanza rapido per il 99% dei casi di utilizzo, allora perché rendere le cose più complicate di quello che hanno bisogno di essere?

  3. 0

    ho un semplice ciclo che legge circa 2000 righe (50k byte) da un file sulla scheda sd utilizzando BufferedReader e li legge tutti in circa 100mS in modalità di debug su galaxy tab 2. non troppo male. poi ho messo uno Scanner il ciclo e il tempo è andato attraverso il tetto (decine di secondi), più un sacco di GC_CONCURANT messaggi

    Scanner scanner = new Scanner(line);
    int eventType = scanner.nextInt(16);

    così, almeno nel mio caso è lo Scanner che è il problema, credo che ho bisogno di eseguire la scansione la partita in un altro modo, ma non ho idea del perché potrebbe essere così lento

Lascia un commento