2012-05-07 11 views
13

Sto cercando di scrivere il metodo di salvataggio dei file più veloce e ottimale possibile. C'è un modo per ottenere la dimensione del blocco di sistema in java? Qualcosa come System.getProperty("block.size") o qualcosa del genere.Scarica la dimensione del blocco di sistema in Java

+1

Non esiste alcuna proprietà di sistema per questo e nessun modo per ottenere le informazioni attraverso puro java. Se questo è un problema, dovresti usare BufferedWriter o BufferedOutputStream – ControlAltDel

+2

+1; buona domanda. Ma IMO ottenere la dimensione del blocco di memoria dall'ambiente di sistema non ha senso in quanto potresti avere diversi punti di mount su un dato sistema supportati da diversi tipi di storage. – home

+8

Ecco perché costruiscono sistemi operativi - per risparmiarti da questi dettagli – ControlAltDel

risposta

6

Il "modo più rapido e ottimale possibile" è sicuramente quello di scrivere utilizzando il buffer più ampio che ci si può permettere; per assicurarsi che le sue dimensioni siano una potenza di due (un megabyte mi viene in mente); e per assicurarsi che le scritture stesse sono tampone allineati:

new BufferedOutputStream(new FileOutputStream(file), 1024*1024); 

Finché vi sono oltre la dimensione del blocco di sistema, che sarà in questa dimensione, e rimanere in linea con essa, che è garantita dalla BufferedOutputStream, questo è il più ottimale possibile.

Si dovrebbe anche esaminare FileChannel.transferTo(), notando che è necessario chiamarlo in un ciclo e che le implementazioni effettive finora non sembrano utilizzare alcuna primitiva del sistema operativo di basso livello (contrariamente alla pubblicità), solo il lo stesso tipo di loop che potresti scrivere tu stesso.

4

Non penso che ci sia una funzione java per farlo. Tuttavia esiste un modo dipendente dal sistema per recuperare tali informazioni. Date un'occhiata a questo answer. Dovrai utilizzare Runtime.exec() e analizzare i dati.

+0

Grazie per il link. Sembra che questa sia una buona soluzione. – kentcdodds

3

Non esiste una proprietà di sistema, ma è possibile utilizzare qualsiasi cosa Java utilizzi per le proprie esigenze e sii certo che questo è il migliore per il tuo sistema operativo/versione Java.

Questa soluzione sfrutta il fatto che il buf utilizzato in BufferedXXXStream classi di Java per contenere i dati è una variabile protected e non un private uno:

class IdealBlockSize { 
    // You could alternatively use BufferedInputStream and System.in . 
    private static class MyBufferedOS extends BufferedOutputStream { 
     public MyBufferedOS() { super(System.out); } 
     public MyBufferedOS(OutputStream out) { super(out); } 
     public int bufferSize() { return buf.length; } 
    } 

    public static int VALUE = new IdealBlockSize.MyBufferedOS().bufferSize(); 
} 

Quindi, è possibile richiamare nel vostro codice di avvio dell'applicazione, come così:

System.out.printf("Ideal block size: %d\n", IdealBlockSize.VALUE); 

// Output 
// Ideal block size: 8192 

Questa soluzione permette di avere i buffer che sono appena sufficiente grande da essere ottimale.

+0

Ottieni 8192 perché quel valore predefinito è hard coded nel costruttore BufferedOutputStream. Nessun rilevamento è fatto. Credo che l'OP stia cercando una soluzione che ottimizzi la sua dimensione del buffer in base a quella del dispositivo a blocchi sottostante. Se il suo dispositivo di blocco è (come è comune) 4k allineato, questo sicuramente non sarà ottimale. – Dave

+0

La scelta di 8192 era probabilmente un compromesso tra i requisiti ortogonali o lettura vs scrittura e accesso sequenziale o casuale e varie scelte del sistema operativo. OP vuole scrivere velocemente. A seconda del motivo, l'I/O diretto potrebbe anche essere il migliore e, se si utilizza la sincronizzazione, la dimensione del blocco logico di FS potrebbe essere ottimale.L'esperienza della maggior parte delle persone sull'impostazione della dimensione del buffer deriva dalla copia, in cui la maggior parte del tempo di clock viene effettivamente utilizzato nelle letture. In questo caso, i buffer più grandi aiutano a causa del buffer read-ahead del sistema operativo. Questo non è il caso per la sola scrittura. – Dave

Problemi correlati