Hi, folks.
I am using PyLucene and doing a lot of get tokens.  lucene.py reports
version 2.4.0.  It is rpath linux with 8GB of memory.  Python is 2.4.

The system indexes 116,000 documents just fine.  

Maxheap is '2048m', 64 bit environment.

Then I need to get the tokens from these documents and near the end, I run
into:

java.lang.OutOfMemoryError: GC overhead limit exceeded

The heap is apparently filling up with each document retrieved and never 
getting cleared.  I was expecting that it would give me the information for one 
document, then clear that and give me the info for another, etc.  I've looked 
at it with jhat.

I have tried deleting the Python objects that receive any information from 
Lucene--no effect.
I have tried reusing the Python objects that receive any information from 
Lucene--no effect.
I have tried running the Python garbage collector (it slowed the program 
slightly, but generally no effect).

Is there anything else I can do to get the tokens for a document and make sure 
that this does not fill up the heap?  I need to be able to run a million or 
more documents through this and get their tokens.


Here is a code snippet.

        reader = self.index.getReader()
        lReader = reader.get()
        searcher = self.index.getSearcher()
        lSearcher = searcher.get()
        query = lucene.TermQuery(lucene.Term(OTDocument.UID_FIELD_ID, uid))
        hits = list(lSearcher.search(query))
        if hits:
            hit = lucene.Hit.cast_(hits[0])
            tfvs = lReader.getTermFreqVectors(hit.id)

            if tfvs is not None: # this happens if the vector is not stored
                for tfv in tfvs: # There's one for each field that has a 
TermFreqVector
                    tfvP = lucene.TermFreqVector.cast_(tfv)
                    if returnAllFields or tfvP.field in termFields: # add only 
asked fields
                        tFields[tfvP.field] = dict([(t,f) for (t,f) in 
zip(tfvP.getTerms(),tfvP.getTermFrequencies()) if f >=minFreq])
        else:
            # This shouldn't happen, but we just log the error and march on
            self.log.error("Unable to fetch doc %s from index"%(uid))

        lReader.close()
        lSearcher.close()

lReader is really:
lucene.IndexReader.open(self._store)

I've tried the Lucene list, but no one there has yet come up with a solution.  
If filling the heap is a Lucene problem (is it a bug), I need to look for a way 
to circumvent that bug.  

Thanks, 

Herb

Reply via email to