Simone,

There is a trade-off in the use of filters - more memory consumed but
faster performance.  It's a good idea to test both approaches (filter
vs. Boolean clause) to find what works best for you.

Each filter will consume 1 bit in memory for each document plus the
overhead of the object itself.  With 50K documents, each filter would
consume approximately 6.5KB of memory, with 1500 consuming approximately
10MB.  That's not a whole lot of memory, and will give you a bump in
search performance.  How much of a bump, you'll have to test to
determine.  I don't have much experience with indexes of you size,
however for the large indexes we work with the gain can be significant.

Michael 

-----Original Message-----
From: Simone Chiaretta [mailto:[email protected]] 
Sent: Wednesday, January 06, 2010 11:46 AM
To: [email protected]
Subject: Re: Possible memory leak in Lucene.NET 2.4?

Michel,
great suggestions thank you

More below

On Wed, Jan 6, 2010 at 8:29 PM, Michael Garski
<[email protected]>wrote:

> Simone -
>
> Filters will provide for more efficient queries in your case if you
> filter on the blog id rather than using it as a query clause as the
> filter can be cached and re-used for future queries.  Be sure to use
the
> FilterManager to ensure your filters are being cached and not
re-created
> for each query.
>

It makes sense when I've just one blog... but can I have, let's say,
1500
different filters one per blog?
What I need is filtering blog posts based on the blog I'm currently in:
so I've to search over blog 1 if I'm in blog 1, and in blog 1500 if I'm
in
blog 1500.
This will mean I'll have to cache 1500 different filters? Or in this
case a
simple plain query will be better?



> Optimizing on startup could delay the app pool being available.  I'd
> suggest that rather than optimizing on a periodic basis that you
create
> a custom MergePolicy to control the number of segments in the index
and
> when segments are merged.  With 2.9 I take this approach and don't use
> the Optimize call at all anymore.  Provided you don't have thousands
of
> segments, a multi-segment index should not pose a performance issue.
> There are quite a number of other performance improvements that can be
> made that have a bigger impact, such as filters.
>

I'll take a look at that.



>
> The 2.9 version I am using is the current trunk version.  It's very
> stable and I have not encountered any issues.
>

Ok.. great...thx


>
> Retrieving the IndexReader from the IndexWriter will give you the most
> recent changes, including those that have not yet been committed.
>
http://lucene.apache.org/java/2_9_1/api/all/org/apache/lucene/index/Inde
> xWriter.html#getReader%28%29
>
>
OK... 2.9 seems to be solving most of my problems :)


> Unfortunately I don't have the bandwidth at this time to help you out
> with a code review, but should you have any questions, continue to
post
> them to the list and I'll provide some feedback as time allows.
>

Ok.. no problem... thank you anyway.. you are being very helpful
Simo


>
> Michael
>
> -----Original Message-----
> From: Simone Chiaretta [mailto:[email protected]]
> Sent: Wednesday, January 06, 2010 11:11 AM
> To: [email protected]
> Subject: Re: Possible memory leak in Lucene.NET 2.4?
>
> Hi Michael,
>
> more below
>
> On Wed, Jan 6, 2010 at 7:41 PM, Michael Garski
> <[email protected]>wrote:
>
> > Simone,
> >
> > Filters work to constrain the query to the subset of documents that
> are
> > contained in the filter, which can improve performance.
>
>
> Ok, from what I see, filtering can help me filter out posts from other
> blogs.
> But can filters change with every query?
> What's the difference between:
> query for "xyz" on blog 1 over all index
> vs.
> query for "xyz" over the index filtered by blog 1?
>
>
> > The field cache
> > is used to cache values if you are sorting by something other than
the
> > score, such as by date or some other value in the index.
> >
>
>
> I'm just sorting by score... so probably not needed
>
>
> >
> > Optimizing after each document incurs an unnecessary overhead as all
> > segments are merged into one, which is not necessary even in
versions
> > prior to 2.9.
> >
>
> Great, thank you... I can remove this, would help speed up the add
> document
> procedure on large indexes...
> and since in web app the pool recycles anyway every day or so, doing
an
> optimize at the creation of the index write will be enough, correct?
>
>
> > If your app has not yet been released, I would suggest using 2.9 and
> > ensuring you are not using any methods or properties marked with the
> > Obsolete attribute to streamline migration to future versions.
>
>
> Great... thank you again... is 2.9 the trunk, right? I don't see a tag
> for
> it in SVN
>
>
> > Another
> > change in 2.9 you could take advantage of is retrieving an
IndexReader
> > from the IndexWriter through the GetReader method, which will save
you
> > from having to have both a writer and a reader in application scope.
> > The writer could be held at the application level and the reader
> > retrieved from it directly.
> >
>
> And that will give the most current reader updated with the latest new
> docs?
>
> One last thing:
> Would you be so kind (if you have time, and with the proper credit
given
> in
> the source code and in the release notes) to do a kind of source code
> review
> to the search engine of the blog?
> Thx
>
> Simone
>
>
> >
> > Michael
> >
> >
> > -----Original Message-----
> > From: Simone Chiaretta [mailto:[email protected]]
> > Sent: Wednesday, January 06, 2010 10:28 AM
> > To: [email protected]
> > Subject: Re: Possible memory leak in Lucene.NET 2.4?
> >
> > I'm just using queries... I'm pretty new to Lucene, so I went for
the
> > easier
> > solution.
> > Would you recommend using filters and caching instead of queries?
> >
> > At the moment I'm on Lucene 2.3.1... would you recommend moving to
> 2.9?
> > My app has not been released yet (an open source blogging engine),
but
> > will
> > be shortly.
> > The number of documents indexed will range from 0 to 50.000 blog
posts
> > (our
> > biggest installation atm).
> >
> > Will not optimizing after every new document reduce the performances
> of
> > the
> > searches on such indexes?
> >
> > Simone
> >
> > On Wed, Jan 6, 2010 at 7:08 PM, Michael Garski
> > <[email protected]>wrote:
> >
> > > Simone,
> > >
> > > Are you using any field caches or filters?
> > >
> > > In versions prior to 2.9, reopening the index will completely
> rebuild
> > > the field cache and filter bits for all documents in the index,
> which
> > > can result in an increase in memory consumption.  In 2.9 and
future
> > > versions, the field cache and filter bits are cached at a segment
> > level,
> > > which results in significantly faster re-opens as only the new
> > segments
> > > are loaded into the caches.
> > >
> > > Our applications use very large indexes and 2.9's segment level
> > caching
> > > allows us to re-open indexes much faster while utilizing less
memory
> > in
> > > the process.
> > >
> > > Michael
> > >
> > > -----Original Message-----
> > > From: Simone Chiaretta [mailto:[email protected]]
> > > Sent: Wednesday, January 06, 2010 10:01 AM
> > > To: [email protected]
> > > Subject: Re: Possible memory leak in Lucene.NET 2.4?
> > >
> > > What I am doing is initializing the writer in the App_Start event
of
> > the
> > > web
> > > app, and closing everything at the App_End event.
> > > For the reader, I start it at the first search request, re-open it
> > > everytime
> > > a new document is added, and then closing it in the App_End
> > >
> > > If you are interested here is the search engine service I'm using:
> > >
> >
>
http://code.google.com/p/subtext/source/browse/trunk/src/Subtext.Framewo
> > >
> >
>
rk/Services/SearchEngine/SearchEngineService.cs<http://code.google.com/p
> >
>
/subtext/source/browse/trunk/src/Subtext.Framewo%0Ark/Services/SearchEng
>
<http://code.google.com/p%0A/subtext/source/browse/trunk/src/Subtext.Fra
> mewo%0Ark/Services/SearchEng>
> > ine/SearchEngineService.cs>
> > >
> > > Simone
> > >
> > > On Wed, Jan 6, 2010 at 6:31 PM, Matt Honeycutt
> > > <[email protected]>wrote:
> > >
> > > > Won't the various global application events be fired if the app
> pool
> > > is
> > > > gracefully terminated/recycled?  While not ideal, couldn't you
> > > initialize
> > > > your Lucene objects during one of the application
initialization,
> > then
> > > > dispose of them in the corresponding shutodwn events?
> > > >
> > > > On Wed, Jan 6, 2010 at 11:14 AM, Michael Garski
> > > <[email protected]
> > > > >wrote:
> > > >
> > > > > If it's not an option to create search functionality in a
> separate
> > > > process,
> > > > > such as in a shared hosting environment, you may be limited in
> the
> > > size
> > > > of
> > > > > your index and how you query it.  The field cache, and to a
> lesser
> > > extent
> > > > > filters, will consume a fair amount of memory that is
> proportional
> > > to the
> > > > > number of documents in the index.
> > > > >
> > > > > As others have mentioned, you will have to ensure that
resources
> > are
> > > > > released when the app pool recycles.
> > > > >
> > > > > Michael
> > > > >
> > > > > -----Original Message-----
> > > > > From: Simone Chiaretta [mailto:[email protected]]
> > > > > Sent: Wednesday, January 06, 2010 12:45 AM
> > > > > To: [email protected]
> > > > > Subject: Re: Possible memory leak in Lucene.NET 2.4?
> > > > >
> > > > > Unfortunately not everybody can use another process: I'm
> building
> > a
> > > > > blog engine that must be able to run on shared hosting
provider.
> > The
> > > > > 2nd process is not an option :)
> > > > >
> > > > > Simone
> > > > >
> > > > > On Tuesday, January 5, 2010, Digy <[email protected]> wrote:
> > > > > > As Michael stated, I prefer also not hosting "indexing and
> > > searching
> > > > > > sevices" in IIS.
> > > > > > There are many alternatives such as WCF, Remoting etc. With
a
> > > separate
> > > > > > service for Lucene, you can control anything you want.
> > > > > >
> > > > > > DIGY
> > > > > >
> > > > > > -----Original Message-----
> > > > > > From: Michael Garski [mailto:[email protected]]
> > > > > > Sent: Tuesday, January 05, 2010 11:11 PM
> > > > > > To: [email protected]
> > > > > > Subject: RE: Possible memory leak in Lucene.NET 2.4?
> > > > > >
> > > > > > Jeff,
> > > > > >
> > > > > > Correct - there is no need to optimize the index after
adding
> a
> > > > > > document, and I would recommend against it especially when
you
> > > move to
> > > > > > 2.9 as you will not see any of the benefits of the changes
to
> > > composite
> > > > > > readers such as faster incremental warm-ups to filters and
> field
> > > > caches.
> > > > > >
> > > > > > I've never run Lucene.Net in the context of a web process
and
> > > would
> > > > > > actually recommend against that approach due to app pool
> > > recycling,
> > > > > > opting for a service that exposed search functionality via
> WCF.
> > > > > >
> > > > > > What types of queries are you executing? Are you using
filters
> > or
> > > > > > sorting?  How often do you re-open the IndexReader that is
> used
> > > for
> > > > > > searching?  Re-opening the reader after each document
addition
> > can
> > > be
> > > > an
> > > > > > expensive process, especially if you are using filters
and/or
> > > sorts.
> > > > > > How are you refreshing the IndexReader?
> > > > > >
> > > > > > Regarding the IndexReader locking files, this is a feature
> which
> > > allows
> > > > > > you to concurrently index and search on the same index and
not
> > > have to
> > > > > > worry about the IndexWriter deleting a segment file from
> > > underneath the
> > > > > > searcher when a segment merge occurs.
> > > > > >
> > > > > > The first place to look would be to use a memory profiler to
> > > determine
> > > > > > what is actually consuming the memory.  I use the SciTech
.NET
> > > Memory
> > > > > > Profiler for such purposes.
> > > > > >
> > > > > > Michael
> > > > > >
> > > > > > -----Original Message-----
> > > > > > From: Jeff Pennal [mailto:[email protected]]
> > > > > > Sent: Tuesday, January 05, 2010 12:42 PM
> > > > > > To: [email protected]
> > > > > > Subject: Possible memory leak in Lucene.NET 2.4?
> > > > > >
> > > > > > Hello all,
> > > > > >
> > > > > > In doing some profiling of our Lucene code, I noticed that
we
> > were
> > > > doing
> > > > > >
> > > > > > an optimize code after every update to our index. Though our
> > index
> > > is
> > > > > > relatively small (~75MB), the optimize task still look way
to
> > much
> > > time
> > > > > > to run.
> > > > > >
> > > > > > I did some research and it seems like it would not be an
issue
> > to
> > > > update
> > > > > >
> > > > > > our index without optimizing afterwords, the side effect
being
> > > that
> > > > we'd
> > > > > >
> > > > > > have more open file handles.
> > > > > >
> > > > > > I made that change and noticed some horrible performance
side
> > > effects.
> > > > > >
> > > > > > The first thing I noticed was that the CPU for our web
> > application
> > > > > > (ASP.NET MVC) that read from the Index never went below
60-70%
> > and
> > > was
> > > > > > frequently pegged at 99%.
> > > > > >
> > > > > > In addition to the CPU spiking, the memory taken up by the
> > > w3wp.exe
> > > > > > process quickly grew to around 800MB, which is about 300MB
> above
> > > > normal.
> > > > > >
> > > > > > This has all the hallmarks of a memory leak somewhere.
> > > > > >
> > > > > > Finally, I noticed that the IndexReader was locking some of
> the
> > > files
> > > > in
> > > > > >
> > > > > > the index folder even though the reader was set to nolock
> mode.
> > > This
> > > > > > seemed to be cause of the increase in the number of files in
> the
> > > index
> > > > > > folder.
> > > > > >
> > > > > > We have the IndexReader set to open once and then be shared
> > among
> > > every
> > > > > > request to the web application. My understanding is that
this
> is
> > > the
> > > > > > correct way to do this, and this never caused and issues
when
> we
> > > were
> > > > > > optimizing the index after every update.
> > > > > >
> > > > > > I know this is a pretty vague problem and there could be any
> > > number of
> > > > > > issues involved here. However, if anyone could suggest areas
> to
> > > look
> > > > > > into for possible solutions, it would be greatly
appreciated.
> > > > > >
> > > > > > Thanks,
> > > > > > Jeff
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > > --
> > > > > Simone Chiaretta
> > > > > Microsoft MVP ASP.NET - ASPInsider
> > > > > Blog: http://codeclimber.net.nz
> > > > > RSS: http://feeds2.feedburner.com/codeclimber
> > > > > twitter: @simonech
> > > > >
> > > > > Any sufficiently advanced technology is indistinguishable from
> > magic
> > > > > "Life is short, play hard"
> > > > >
> > > > >
> > > > >
> > > >
> > >
> > >
> > >
> > > --
> > > Simone Chiaretta
> > > Microsoft MVP ASP.NET - ASPInsider
> > > Blog: http://codeclimber.net.nz
> > > RSS: http://feeds2.feedburner.com/codeclimber
> > > twitter: @simonech
> > >
> > > Any sufficiently advanced technology is indistinguishable from
magic
> > > "Life is short, play hard"
> > >
> > >
> >
> >
> > --
> > Simone Chiaretta
> > Microsoft MVP ASP.NET - ASPInsider
> > Blog: http://codeclimber.net.nz
> > RSS: http://feeds2.feedburner.com/codeclimber
> > twitter: @simonech
> >
> > Any sufficiently advanced technology is indistinguishable from magic
> > "Life is short, play hard"
> >
> >
>
>
> --
> Simone Chiaretta
> Microsoft MVP ASP.NET - ASPInsider
> Blog: http://codeclimber.net.nz
> RSS: http://feeds2.feedburner.com/codeclimber
> twitter: @simonech
>
> Any sufficiently advanced technology is indistinguishable from magic
> "Life is short, play hard"
>
>


-- 
Simone Chiaretta
Microsoft MVP ASP.NET - ASPInsider
Blog: http://codeclimber.net.nz
RSS: http://feeds2.feedburner.com/codeclimber
twitter: @simonech

Any sufficiently advanced technology is indistinguishable from magic
"Life is short, play hard"

Reply via email to