I'm not an expert, so please take this with a grain of salt, but if
you return the Hits object, you are inadvertently "holding on" to
that IndexSearcher, right?
According to the FAQ (http://wiki.apache.org/lucene-java/
ImproveSearchingSpeed), iterating over all Hits will result in
additional queries. Further, I don't think that you should call
Directory.close() because it doesn't really do anything if the
Searcher is still out there ...
If I was in your place, I would try to iterate over the first N
(100?) results and return the results back to the caller in some
wrapper object, leaving the Searcher and the Directory open, at least
for a test.
If you really need to go against the recommended best practice and
close the IndexSearcher, then I would strongly suggest some kind of
scheduler that closes, re-opens, and warms up IndexSearchers on some
kind of timer.
Good luck!
-h
----------------------------------------------------------------------
Hira, N.R.
Cognocys, Inc.
(773) 251-7453
On 05-Sep-2008, at 10:43 AM, Andy33 wrote:
If I don't keep the IndexSearcher as a Singleton and instead open
and close a
new one each time, I have a large memory leak (probably due to the
large
queries I am doing). After watching the memory a while, I still
believe I
have a small memory leak even when the Directory, Analyzer, and
IndexSearcher are Singletons. My free memory slowly becomes smaller
after
each query. Any ideas on what that may be due to?
Here's my updated code...
private synchronized Hits doQuery(String field, String queryStr, Sort
sortOrder, String indexDirectory) throws Exception
{
Directory directory = null;
Query query = null;
QueryParser parser = null;
try
{
directory = DirectorySingleton.getInstance(indexDirectory);
ivIndexSearcher = (IndexSearcher)
SearcherSingleton.getInstance(directory);
//search the index
parser = new QueryParser(field, AnalyzerSingleton.getInstance());
query = parser.parse(queryStr);
return ivIndexSearcher.search(query, sortOrder);
}
finally
{
if(null != directory)
{
directory.close();
}
directory = null;
parser = null;
query = null;
}
}
--------------
Example Singleton
public class SearcherSingleton
{
private static volatile HashMap<Directory, Searcher> cvSearches
= new
HashMap<Directory, Searcher>();
protected SearcherSingleton()
{
}
public static Searcher getInstance(Directory directory) throws
IOException
{
if(!cvSearches.containsKey(directory))
{
synchronized(SearcherSingleton.class)
{
if(!cvSearches.containsKey(directory))
{
cvSearches.put(directory, new IndexSearcher(directory));
}
}
}
return cvSearches.get(directory);
}
}
장용석 wrote:
In fact, I think that the important reasons are Directory class and
Analyzer
class.
If you don't want IndexSearcher class keep open for the entire
life of a
web
application, you can do it.
I think It will not cause memory leak problem.
But, Directory and Analyzer classes can cause the problem if they new
created by method call every time. I think...
Only keep two classes Directory and Analyzer by singlton and do
test. :)
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]