Sto lavorando su un codice Java che verrà utilizzato in un app server per accedere ad alcuni file molto grandi (oltre 1 GB, meno di 20 GB), eventualmente ospitati su un NFS Condividere. Manutenzione una richiesta individuale coinvolgerà facendo questo:java.io.RandomAccessFile scalabilità (o altre opzioni)
- Trovare il file di grandi dimensioni ho bisogno di leggere
- navigare in un punto a caso in quel file
- Byte letti da quel file (di solito sotto 1MB)
- Rientro quelli byte
ho qualche semplice codice POC felice in questo momento che si apre semplicemente un nuovo file di sola lettura e la chiude:
RandomAccessFile raf=new RandomAccessFile(myFileName, "r");
try{
byte[] buffer = new byte[size];
raf.seek(position);
raf.reafFully(buffer);
return buffer;
}
finally{
raf.close();
}
Mi chiedo se questo è un approccio elegante semplice che dovrebbe funzionare molto bene, o un approccio follemente semplicistico che avrà molti problemi sotto carico pesante (e forse ho bisogno di creare un pool sicuro di thread lettori, ecc.). Ovviamente testare questa ipotesi sarebbe la cosa migliore, ma mi stavo chiedendo se esistessero buone pratiche o problemi noti con entrambi gli approcci. Finora non sono stato in grado di capire molto googling ...
Grazie!
PS. Non è ancora chiaro se la versione finale di questo sarà ospitata su Windows o * nix. Inoltre, non è chiaro come i file di grandi dimensioni verranno condivisi. PPS. È probabile che i server di app siano configurati in un cluster, pertanto due server di app diversi potrebbero dover leggere lo stesso file condiviso di grandi dimensioni contemporaneamente.
mi sta bene. non è possibile ottenere più velocemente di così, a meno che non si memorizzi nella cache il file sul disco locale o nella memoria – irreputable
Quindi il costo dell'apertura e del rilascio degli handle di file è trascurabile? Anche attraverso, diciamo, una condivisione NFS? – Dave
che probabilmente non è trascurabile, anche su file locali. se è una preoccupazione, puoi tenere un gruppo di maniglie. oppure, mantenere 1 'FileChannel' aperto, leggerlo contemporaneamente da' read (dst, position) ' – irreputable