2013-07-31 5 views
5

Ho un file di indice duro come FSdirectory, la cui dimensione è di circa 2 GB. Voglio caricarlo in ram per avere una migliore velocità di ricerca. Io uso il codice sottostante:Come caricare un file indice di FSdirectory come una directory RAM in Lucene?

Directory dic=new RAMDirectory(FSDirectory.open(new File("file path")), IOContext.DEFAULT); 

Ma non sono sicuro che funzioni. Qualcuno sa che funziona o no? Qualunque altro modo migliore di questo?

Sarò felice di qualsiasi suggerimento. Grazie.

+0

Otterrai un migliore caricamento caricandolo direttamente (non utilizzare RAMDir), la cache del file os caricherà l'indice in mem per te. Non dimenticare di configurare jvm Xmx di conseguenza: lascia un mem gratuito all'OS, almeno 2G nel tuo caso. (Ad esempio su un sistema 4G usa Xmx2G). – nomoa

+0

@nomoa Non ho capito cosa intendi per caricare direttamente. come farlo? notare che voglio usarlo in un'applicazione web eseguita da tomcat. – anony

+0

Voglio dire che non avrai una migliore velocità di ricerca con RAMDirectory, guarda il documento java che dice: Attenzione: questa classe non è pensata per funzionare con indici enormi. Avrai una migliore velocità di ricerca modificando parametri jvm e parametri os (swappiness su linux). Dovresti dare un'occhiata ad alcune FAQ di lucene perf. – nomoa

risposta

2

Sì, è possibile costruire RAMDirectory in questo modo ma è fortemente sconsigliato nel tuo caso. RAMDirectory non è progettato per essere utilizzato con un set di dati di grandi dimensioni (più di 100 MB). Sarà molto intensivo in termini di GC, a lungo per costruire e consumare il prezioso spazio Heap di JAVA.

Se avete problemi Potenza assicurarsi di seguire tutte le linee guida modo descritto nella this lucene FAQ

Non dimenticate che per ottenere velocità di ricerca di discesa il sistema operativo ha bisogno di memorizzare nella cache una parte dell'indice in memoria. Per fare questo è necessario lasciare un mem gratuito disponibile per il sistema operativo. Se hai 16 GB di RAM fisica e un indice da 8 GB devi configurare il jm Xmx con 8 g. Un bel strumento linux per controllare mem è htop, stamperà la RAM usata per il processo come verde (lo spazio dell'heap) e la RAM usata come filecache come gialla (i dati dell'indice).

Alcuni sviluppatori eseguono query di riscaldamento all'avvio dell'applicazione per impedire al primo utente di rimanere bloccato per alcuni secondi mentre l'indice viene caricato da os filecache.

Quindi, se pensi ancora di poter ottenere un risultato migliore, puoi provare alcuni trucchi con RAMfs. Ma dubito che tu possa ottenere prestazioni migliori di un sistema operativo e jvm ottimizzato con MMapDirectory.