void Add(object keyX,object valueX) { InternalTable.Add( new WeakEntry(keyX), value); }
Object Get(object keyX) { return InternalTable[new WeakEntry(keyX)]; } WeakEntry.GetHashCode = key.getHashCode; WeakEntry.Equals = keyA == keyB Not sure this is clear enough - I can post full implementation if you'd like but that'll take me some more time. Eyal > -----Original Message----- > From: Digy [mailto:digyd...@gmail.com] > Sent: Sunday, January 11, 2009 23:16 PM > To: lucene-net-dev@incubator.apache.org > Subject: RE: [jira] Commented: (LUCENENET-106) Lucene.NET > (Revision: 603121) is leaking memory > Importance: High > > Hi Eyal, > > I couldn't find a simple way to use the WeakEntry as a key > and then access its value without enumerating all the keys in > InternalTable. > I think you suggest > > void Add(object keyX,object valueX) > { > InternalTable.Add( new WeakEntry(keyX,valueX), value); > } // or something like that. > > Then how do you think that we get the value of "Get(keyX)" ? > Enumerating all the keys of InternalTable and comparing the > "weakEntry.Key" with "keyX"? > When thinking of successive "Add"s, this has the complexity of O(n*n). > > Can you share your solution? > > DIGY > > > > -----Original Message----- > From: Eyal Post [mailto:eyalp...@epocalipse.com] > Sent: Sunday, January 11, 2009 1:08 PM > To: lucene-net-dev@incubator.apache.org > Subject: RE: [jira] Commented: (LUCENENET-106) Lucene.NET > (Revision: 603121) is leaking memory > > As Luc noted in the first comment to this patch, I think that > if this class is to be called WeakHashTable (and therefor > imply it is a general purpose weak hash table) then it should > be implemented as a real hash table. > Therefor, you should not use an array list and make linear > comparisons. > Instead WeakHashTable should internally use a hashtable. The > first implementation was in the right direction, the only fix > should have been to use WeakEntry as a key to the table and > not the hash code. > > Eyal > > > > -----Original Message----- > > From: Digy [mailto:digyd...@gmail.com] > > Sent: Friday, January 09, 2009 20:03 PM > > To: lucene-net-dev@incubator.apache.org > > Subject: RE: [jira] Commented: (LUCENENET-106) Lucene.NET > > (Revision: 603121) is leaking memory > > > > Hi Tim, > > > > > > > > Thanks for the comments. I will correct the 3,4,5. > > > > > > > > 1) Since ArrayList contains WeakEntries & sync.ed for multiple > > threads, they can not be null and can not be any other > type. I can not > > find a bug here. Maybe you can send a more detailed description. > > > > 2), WeakHashTable is compatible with "HashTable" in .Net world. > > "Ht.Add(key,value)" throws an exception for duplicate keys but > > > > "Ht[key]=value" just adds or replaces. > > > > > > > > > > > > DIGY > > > > > > > > > > > > > > > > -----Original Message----- > > From: Tim Januario (JIRA) [mailto:j...@apache.org] > > Sent: Friday, January 09, 2009 7:16 PM > > To: lucene-net-dev@incubator.apache.org > > Subject: [jira] Commented: (LUCENENET-106) Lucene.NET > > (Revision: 603121) is leaking memory > > > > > > > > > > > > [ > > https://issues.apache.org/jira/browse/LUCENENET-106?page=com.a > tlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&fo > cusedCommentId > =12662433#action_12662433 ] > > > > Tim Januario commented on LUCENENET-106: > > ---------------------------------------- > > > > Digy, > > 1) The WeakHashTable.Exists method creates a possible > NullReferenceException because you used WeakEntries[i] As > WeakEntry instead of (WeakEntry)WeakEntries[i]. This is only > a warning but... > > 2) The Java WeakHashMap does not throw an execption when > put() is called with a key that already exists in the table. > It simply replaces the old value with the new value. .NET > Hashtable does the same. The Add method of WeakHashTable > should remove the WeakEntry if the key is found and replace > it with the new value in order to stay in line instead of > throwing the Exception. > > 3) WeakHashTableEnumarator should be WeakHashTableEnumerator > > 4) WeakEntry.HashCode is not used and should be removed. > > 5) WeakHashTable.InitialMem is not used and should be removed. > > > > Other than that, I think this looks good. > > > > -tim > > > > > Lucene.NET (Revision: 603121) is leaking memory > > > ----------------------------------------------- > > > > > > Key: LUCENENET-106 > > > URL: > > https://issues.apache.org/jira/browse/LUCENENET-106 > > > Project: Lucene.Net > > > Issue Type: Bug > > > Environment: .NET 2.0 > > > Reporter: Anton K. > > > Assignee: Digy > > > Priority: Critical > > > Attachments: DIGY-FieldCacheImpl.patch, Digy.rar, > > luceneSrc_memUsage.patch, Paches for v2.3.1.rar, WeakHashTable > > v2.patch, WeakHashTable+FieldCacheImpl.rar, WeakReferences.rar > > > > > > > > > readerCache Hashtable field (see FieldCacheImpl.cs) never releases > > some > hash items that have closed IndexReader object as a key. So a > lot of Term instances are never released. > > > Java version of Lucene uses WeakHashMap and therefore doesn't have > > this > problem. > > > This bug can be reproduced only when Sort functionality used during > search. > > > See following link for additional information. > > > http://www.gossamer-threads.com/lists/lucene/java-user/55681 > > > Steps to reproduce: > > > 1)Create index > > > 2) Modify index by IndexWiter; Close IndexWriter > > > 3) Use IndexSearcher for searching with Sort; Close InexSearcher > > > 4) Go to step 2 > > > You'll get OutOfMemoryException after some time of running > this algorithm. > > > > -- > > This message is automatically generated by JIRA. > > - > > You can reply to this email to add a comment to the issue online. > >