2009-12-15 11 views
5

Supongamos que deseo obtener varias de las propiedades de un archivo (propietario, tamaño, permisos, tiempos) devueltas por la llamada al sistema lstat(). Una forma de hacerlo en Java es crear un objeto java.io.File y hacer llamadas como length(), lastModified(), etc. en él. Tengo dos problemas hasta ahora:Unix stat()/lstat() para Java

  1. Cada una de estas llamadas desencadena una llamada stat(), y para mi propósitos stat() s se consideran caro: Estoy tratando de escanear miles de archivos en paralelo cientos de hosts, y (en una primera aproximación), la única forma de acceder a estos archivos es a través de NFS, a menudo contra clústeres de archivadores donde stat() bajo carga puede tardar medio segundo.

  2. La llamada no es lstat(), es típicamente stat() (que sigue a los enlaces simbólicos) o fstat64() (que abre el archivo y puede desencadenar una operación de escritura para registrar el tiempo de acceso).

¿Hay una manera "correcta" de hacer esto, de tal manera que termino simplemente haciendo una sola llamada lstat() y acceder a los miembros de la struct stat? Lo que he encontrado hasta el momento de buscar en Google:

  • JDK 7 tendrá la interfaz PosixFileAttributes en java.nio.file con todo lo que quiero (pero yo preferiría no estar corriendo versiones compiladas de mi JDK si puedo evitarlo).

  • Puedo rodar mi propia interfaz con JNI o ​​JNA (pero preferiría no tenerla si la hay).

Un previous similar question tiene un par de implementaciones sugeridas JNA JNI /. Uno se ha ido y el otro se mantiene dudosamente (por ejemplo, sin descargas, solo un repositorio de hg).

¿Hay mejores opciones?

Respuesta

2

Parece que cubriste prácticamente todas las bases. Cuando comencé a leer su pregunta, mi primer pensamiento fue JDK 7 o JNI. Sin saber nada sobre el patrón de cambio en estos archivos, también podría buscar algún tipo de memoria caché persistente de la información en cuestión, como una base de datos incrustada. También puede consultar otro método de acceso además de NFS, como un servicio web personalizado que proporciona información de archivos masiva desde un host remoto.

+0

Gracias! En última instancia, supongo que JDK 7 no es tan malo; Puedo guardar los archivos binarios con la herramienta que estoy escribiendo, y pronto será un software de producción. –

1

Sí, stat() está debajo de todas las llamadas y bibliotecas. Es un problema de latencia. Sin embargo, puedes hacer muchas estadísticas() a la vez, ya que hay muchos daemons del servidor NFS para admitir tus conexiones, usando hilos a menos que alguien tenga una estadística asíncrona() en la manga. Si pudieras conectarte con el host, como con ssh, stat() sería mucho más económico. Incluso podría escribir un servicio tcp para transmitir en rutas y transmitir stat(). Desafortunadamente, el acceso al servidor NFS es difícil o imposible, ya que solo puede tener cuentas de administrador, ser una SAN de Hitachi o algo así.

+0

Para obtener un poco de información histórica: los servidores NFS en cuestión eran un clúster Isilon de 5-10PB, que proporcionaba una coherencia estricta en las llamadas de estadísticas pero a costa de una terrible latencia bajo contención. (Todavía no estoy seguro de si tenían un candado grande o algo más sofisticado). Este era un problema a nivel del sistema de archivos: no lo hicimos mejor como root. Terminamos simplemente dejándolo tomar su tiempo en lugar de pasar unos pocos días tratando de ahorrar unos días de tiempo en la computadora. –

Cuestiones relacionadas