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
risposta
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.
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.
Grazie per il link. Sembra che questa sia una buona soluzione. – kentcdodds
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.
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
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
- 1. Ottieni la dimensione del sistema RAM
- 2. Qual è la dimensione del blocco del filesystem iphone?
- 3. Impossibile modificare la dimensione del blocco in BorderLayout
- 4. la dimensione del carattere influisce sull'altezza dell'elemento del blocco?
- 5. Scarica la documentazione dell'API Java?
- 6. C# richiama la dimensione della cache del file di sistema
- 7. Per Google App Engine (java), come posso impostare e utilizzare la dimensione del blocco in FetchOptions?
- 8. Dimensione blocco file system
- 9. Come si ottiene la dimensione del carattere di default del sistema in Qt?
- 10. Scarica la versione java dal file batch
- 11. Problema di dimensione del blocco di Hadoop e dimensione del file?
- 12. Scarica la versione del browser di IE utilizzando Javascript
- 13. Ottieni l'indirizzo MAC del sistema in Java
- 14. Finestra del proprietario del blocco Java FX
- 15. effetti di blocco in Java
- 16. Come trovare la dimensione della memoria virtuale e la dimensione della cache di un sistema Linux?
- 17. Come ottenere la dimensione della memoria di sistema disponibile?
- 18. Python ftplib Dimensione blocco ottimale?
- 19. Java statica del codice di blocco
- 20. Dimensione chiave AES in Java
- 21. Aumentare la dimensione heap in Java
- 22. iOS Foundation: dimensione carattere di sistema
- 23. Calcola la dimensione dell'oggetto in Java
- 24. Scarica l'applet java dalla pagina web
- 25. Suoni di sistema in Java
- 26. Rilascio del blocco di file Java in Windows
- 27. Modifica la dimensione del buffer di socket predefinita in Windows
- 28. In che modo Java determina la proprietà di sistema 'file.encoding'?
- 29. Scarica allegati utilizzando Java posta
- 30. Presentazione del beamer RStudio modifica la dimensione del font per il blocco
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
+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
Ecco perché costruiscono sistemi operativi - per risparmiarti da questi dettagli – ControlAltDel