2009-12-15 15 views
5

Supponiamo di voler ottenere molte delle proprietà di un file (proprietario, dimensione, autorizzazioni, tempi) restituite dalla chiamata di sistema lstat(). Un modo per farlo in Java è creare un oggetto java.io.File e fare chiamate come length(), lastModified(), ecc. Ho due problemi finora:Unix stat()/lstat() per Java

  1. Ognuna di queste chiamate innesca una chiamata stat(), e per i miei scopi stat() s sono considerati costosi: Sto cercando di eseguire la scansione di miliardi di file in parallelo su centinaia di host e (in prima approssimazione) l'unico modo per accedere a questi file è tramite NFS, spesso contro i cluster di file dove stat() sotto carico può impiegare mezzo secondo.

  2. La chiamata non è lstat(), è tipicamente stat() (che segue i collegamenti simbolici) o fstat64() (che apre il file e può attivare un'operazione di scrittura per registrare il tempo di accesso).

C'è un modo "giusto" per fare questo, in modo tale che io alla fine solo facendo un unico lstat call() e l'accesso ai membri della struct stat? Quello che ho trovato finora da Googling:

  • JDK 7 avrà l'interfaccia PosixFileAttributes in java.nio.file con tutto quello che voglio (ma io preferirei non essere in esecuzione nightly build del mio JDK se posso evitarlo).

  • Posso aprire la mia interfaccia con JNI o ​​JNA (ma preferirei non se ce n'è uno esistente).

Un previous similar question ottenuto un paio di proposte implementazioni JNA JNI /. Uno è andato e l'altro è mantenuto in modo discutibile (ad esempio, nessun download, solo un repository hg).

Ci sono delle opzioni migliori là fuori?

risposta

2

Sembra che tu abbia praticamente coperto tutte le basi. Quando ho iniziato a leggere la tua domanda il mio primo pensiero è stato JDK 7 o JNI. Senza sapere nulla del modello di cambiamento su questi file, si potrebbe anche cercare una sorta di cache persistente delle informazioni in questione, come un DB incorporato. Si potrebbe anche guardare qualche altro metodo di accesso oltre a NFS, come un servizio Web personalizzato che fornisce informazioni di file di massa da un host remoto.

+0

Grazie! In definitiva credo che JDK 7 non sia poi così male; Posso semplicemente tenere i binari con lo strumento che sto scrivendo, e sarà presto un software di livello produttivo. –

1

Sì, stat() è sotto tutte le chiamate e le librerie. È un problema di latenza. Tuttavia, puoi fare molte stat() in una volta, dato che ci sono molti daemon del server NFS per supportare le tue connessioni, usando thread a meno che qualcuno non abbia una statistica asincrona() nella loro manica! Se si potesse ottenere sull'host, come con ssh, stat() sarebbe molto più economico. Potresti anche scrivere un servizio TCP per lo streaming nei percorsi e lo streaming di stat(). Sfortunatamente, l'accesso al server NFS è difficile o impossibile, in quanto può contenere solo account amministrativi, una SAN Hitachi o qualcosa del genere.

+0

Per un po 'di background storico: i server NFS in questione erano un cluster Isilon da 5-10PB, che forniva una stretta coerenza alle chiamate stat ma al costo di una terribile latenza in conflitto. (Non sono ancora sicuro se avessero un grosso blocco o qualcosa di più sofisticato.) Si trattava di un problema a livello di file system: non abbiamo fatto un sshed migliore come root. Abbiamo finito per lasciare che ci prendesse il suo tempo piuttosto che trascorrere qualche giorno di tempo in cui le persone cercavano di risparmiare qualche giorno di tempo al computer. –