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
Respuesta
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.
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.
Gracias por el enlace. Parece que esta es una solución bastante buena. – kentcdodds
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.
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
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
- 1. Tamaño del bloque del sistema de archivos
- 2. Obtener el tamaño de la memoria del sistema operativo Java
- 3. Obtener el tamaño del sistema RAM
- 4. ¿Cómo obtener el tamaño de la memoria del sistema disponible?
- 5. Java obtener color y tamaño del borde
- 6. Obtener salida de símbolo del sistema a cadena en Java
- 7. C# obtener el tamaño de la memoria caché del archivo del sistema
- 8. Obtener fuente predeterminada del sistema
- 9. Obtener el tamaño del monitor en python
- 10. Obtener el tamaño del puntero en C
- 11. ¿Tamaño del bloque de Hadoop y problema con el tamaño del archivo?
- 12. Sonidos del sistema en Java
- 13. iOS Foundation: tamaño de fuente del sistema
- 14. tamaño de letra Afecta la altura del elemento del bloque?
- 15. Determinar el tamaño del clúster del sistema de archivos en Python
- 16. Hadoop fs búsqueda de tamaño de bloque?
- 17. Cómo obtener el tamaño de una clave RSA en Java
- 18. Marco de pruebas del sistema en Java
- 19. obtener el nivel de volumen del sistema actual en iPhone
- 20. ¿Cómo obtener el tiempo de actividad del sistema en Windows?
- 21. java obtener el tamaño de archivo de manera eficiente
- 22. Cómo obtener el tamaño del archivo HttpPostedFileBase
- 23. Información del dispositivo de bloque sin montar (en Linux)
- 24. Variable de entorno del sistema Java
- 25. ¿Cómo obtener información del sistema en PHP?
- 26. Cómo ejecutar el programa Java en el símbolo del sistema
- 27. Problemas Tamaño de fragmento en Google del sistema de archivos
- 28. ¿Cómo puedo obtener el valor de la variable del sistema en Java?
- 29. Cómo obtener la configuración regional del sistema y el idioma del sistema en cocoa
- 30. Obtener el tamaño del archivo en el disco
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
+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
Es por eso que construyen sistemas operativos: para evitarle estos detalles – ControlAltDel