2012-05-07 17 views
13

Estoy tratando de escribir el método de almacenamiento de archivos más rápido y óptimo posible. ¿Hay alguna manera de obtener el tamaño de bloque del sistema en Java? Algo así como System.getProperty("block.size") o algo así.Obtener el tamaño de bloque del sistema en Java

+1

No hay una propiedad del sistema para esto, y no hay forma de obtener la información a través de java puro. Si esto es una preocupación, debería usar un BufferedWriter o un BufferedOutputStream – ControlAltDel

+2

+1; buena pregunta. Pero IMO obtener el tamaño de bloque de almacenamiento del entorno del sistema no tiene sentido ya que puede tener varios puntos de montaje en un sistema determinado respaldado por diferentes tipos de almacenamiento. – home

+8

Es por eso que construyen sistemas operativos: para evitarle estos detalles – ControlAltDel

Respuesta

6

La forma más rápida y óptima posible es, sin duda, escribir utilizando el mayor búfer que pueda pagar; para asegurarse de que su tamaño sea una potencia de dos (un megabyte viene a la mente); y para asegurarse de que las propias escrituras son buffer-alineados:

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

Mientras usted está sobre el tamaño de bloque del sistema, que se encontrará en este tamaño, y permanecer alineado con él, que está garantizada por la BufferedOutputStream, esto es lo más óptimo posible.

También debe consultar FileChannel.transferTo(), teniendo en cuenta que debe llamarlo en un bucle, y que las implementaciones actuales hasta ahora no parecen usar primitivas de sistema operativo de bajo nivel (al contrario de la publicidad), solo el el mismo tipo de bucle que podrías escribir tú mismo.

4

No creo que haya una función java para hacer eso. Sin embargo, hay una forma dependiente del sistema para recuperar esa información. Eche un vistazo a este answer. Deberá usar Runtime.exec() y analizar los datos.

+0

Gracias por el enlace. Parece que esta es una solución bastante buena. – kentcdodds

3

No hay propiedad del sistema pero puede usar lo que Java use para sus propias necesidades y estar seguro de que es lo mejor para su combinación de versión de SO/Java.

Esta solución aprovecha el hecho de la buf utilizado en BufferedXXXStream clases de Java para contener los datos es una variable protected y no 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(); 
} 

A continuación, puede invocar en su código de inicio de la aplicación, como por lo que:

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

// Output 
// Ideal block size: 8192 

Esta solución le permite tener tampones que son basta grande para ser óptima.

+0

Obtiene 8192 porque ese valor predeterminado está codificado en el constructor BufferedOutputStream. No se realiza detección Creo que OP está buscando una solución que optimice su tamaño de búfer en función del dispositivo de bloque subyacente. Si su dispositivo de bloqueo es (como es común) 4k alineado, seguramente no será óptimo. – Dave

+0

La elección de 8192 probablemente fue un compromiso a través de los requisitos ortogonales o lectura vs escritura y acceso secuencial vs acceso aleatorio y diferentes opciones del sistema operativo. OP quiere escribir rápido. Dependiendo de por qué, la IO directa podría ser incluso la mejor y si se utiliza la sincronización, entonces el tamaño de bloque lógico de la FS podría ser óptimo.La experiencia de la mayoría de las personas al establecer el tamaño del búfer proviene de la copia, donde la mayor parte del tiempo del reloj se usa realmente en las lecturas. En ese caso, los búferes mucho más grandes ayudan debido al búfer de lectura anticipada del sistema operativo. Este no es el caso para solo escritura. – Dave

Cuestiones relacionadas