import org.apache.lucene.search.Searcher; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.*; import org.apache.lucene.index.*; import org.apache.lucene.store.RAMDirectory;
/** * Index is ~100mb. * Run with -Xmx256m on Windows XP * * OutOfMemoryException encountered after repeatedly * opening/searching/closing an index. * Seems to only occur when Searcher scope is outside the loop */ public class TestOpenClose { public static void main(String[] args) throws Exception { String db = "C:/data/index"; String field = "field"; String term = "keywords"; //Normal behavior - no memory exceptions //The Searcher's scope is inside the loop for(int i = 0; i < 5; ++i){ System.out.println(i); RAMDirectory ramdir = new RAMDirectory( db ); Searcher searcher = new IndexSearcher( ramdir ); searcher.search(new TermQuery( new Term(field, term))); searcher.close(); ramdir.close(); } //OutOfMemoryException after a few iterations //Search scope is outside the loop Searcher searcher = null; for(int i = 0; i < 5; ++i){ System.out.println(i); RAMDirectory ramdir = new RAMDirectory( db ); searcher = new IndexSearcher( ramdir ); searcher.search(new TermQuery( new Term(field, term))); searcher.close(); ramdir.close(); } } } On 7/5/06, Chris Hostetter <[EMAIL PROTECTED]> wrote:
The mailing list server doesn't allow most attachments (i think the magic incantation is to make sure your mail client indicates that the attachments are plain text -- not some fancy type like text/x-java-source or application/x-java) try including it inline in your email. : Date: Wed, 5 Jul 2006 21:50:35 -0700 : From: Heng Mei <[EMAIL PROTECTED]> : Reply-To: java-user@lucene.apache.org : To: java-user@lucene.apache.org : Subject: Re: IndexSearcher memory leak? : : Thanks for the fast response -- you're right, I had a typo in the code snippet. : : I've attached the test code that reproduces the OutOfMemoryException. : The code is a simple main method that repeatedly opens/searches/closes : an index using RAMDirectory. Maybe there's something I'm overlooking, : but it appears that when the Searcher is declared outside of the loop, : that's when the OutOfMemoryException occurs. If the searcher is : declared inside of the loop, then there's no memory problem. : : The motivation for this test code is that I plan to write a : long-running server that periodically reopens an index -- so clearly : I'd want to be able to close and open the index without leaking any : memory. : : Any insight on why the memory exception occurs and how to resolve it : would be greatly appreciated. : : : Thanks! : ~Heng : : On 7/5/06, Chris Hostetter <[EMAIL PROTECTED]> wrote: : > : I get an OutOfMemoryException after a few iterations of the following loop: : > : LOOP: : > : ramdir = new RAMDirectory( "path/to/my/directory" ); : > : searcher = new IndexSearcher( reader ); : > : searcher.search(new TermQuery( new Term( "field", "keyword"))); : > : searcher.close(); : > : ramdir.close(); : > : END LOOP: : > : Note, ramdir and searcher are both instance variables. : > : > But what is "reader" ? .. where is it initialized ? : > : > I'm guessing this isn't hte exact code that gives you an OOM (since there : > seems to be some code missing) : > : > if you can post a complete small example program (with main method) that : > demonstrates this problem -- or even better a self contained JUNit test -- : > then people can try to reproduce it. : > : > (if the root of the issue is opening a RAMDirectory based on an : > FSDirectory you can create the on disk directory using the system tmpdir : > in your JUnit setUp method) : > : > I suspect that somewhere in there you have another line that looks like... : > : > reader = IndexReader.open( ramdir ); : > : > ...and that may be causing your problem. If you open an IndexReader : > explicitly, then IndexSearcher.close() won't close it for you : > : > : > : > : > : > -Hoss : > : > : > --------------------------------------------------------------------- : > To unsubscribe, e-mail: [EMAIL PROTECTED] : > For additional commands, e-mail: [EMAIL PROTECTED] : > : > : : -Hoss --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]