2012-11-29 13 views
5

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)

  1. Trovare il file di grandi dimensioni ho bisogno di leggere
  2. navigare in un punto a caso in quel file
  3. Byte letti da quel file (di solito sotto 1MB)
  4. 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.

+1

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

+0

Quindi il costo dell'apertura e del rilascio degli handle di file è trascurabile? Anche attraverso, diciamo, una condivisione NFS? – Dave

+0

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

risposta

2

Un'altra opzione è java NIO, ovvero FileChannel. FileChannel è anche navigabile e potrebbe essere più veloce di RandomAccessFile perché può funzionare con i cosiddetti buffer diretti. Ha alcune funzioni più interessanti, ad esempio è interrompibile.

+0

Good call. Sì, ho provato con quelli. Sembra che sia trascurabilmente più veloce, ma non abbastanza veloce da giustificare necessariamente la complessità in * questo * caso d'uso particolare. Di recente sono stato masterizzato da nio a causa di una perdita di memoria fisica di Windows nella JVM su un'altra app, quindi sono stato un po 'esitante a utilizzarlo da allora. Onestamente, se l'approccio dell'accesso casuale viene eseguito sotto carico come avviene nei test a thread singolo, è perfetto per me. – Dave

+0

Esatto, controlla ancora questo se non hai ancora http://stackoverflow.com/questions/1605332/java-nio-filechannel-versus-fileoutputstream-performance-usefulness –

Problemi correlati