I think this is all fine. Because things are keyed on core-reader and
there are already core listeners installed to purge when the ref count
for a core drops to zero.

honestly if you change the map to a regular one, all tests pass.

On Fri, Jan 30, 2015 at 5:37 AM, Uwe Schindler <u...@thetaphi.de> wrote:
> Sorry Robert – you’re right,
>
>
>
> I had the impression that we changed that already. In fact, the WeakHashMap
> is needed, because multiple readers (especially Slow ones) can share the
> same uninverted fields. In the ideal world, we should change the whole stuff
> and remove FieldCacheImpl completely and let the field maps stay directly on
> the UninvertingReader as regular member fields. The only problem with this
> is: if you have multiple UninvertigReaders, all of them have separate
> uninverted instances. But this is a bug already if you do this.
>
>
>
> Uwe
>
>
>
> -----
>
> Uwe Schindler
>
> H.-H.-Meier-Allee 63, D-28213 Bremen
>
> http://www.thetaphi.de
>
> eMail: u...@thetaphi.de
>
>
>
> From: Robert Muir [mailto:rcm...@gmail.com]
> Sent: Friday, January 30, 2015 5:04 AM
> To: dev@lucene.apache.org
> Subject: Re: Our Optimize Suggestions on lucene 3.5
>
>
>
> I am not sure this is the case. Actually, FieldCacheImpl still works as
> before and has a weak hashmap still.
>
> However, i think the weak map is unnecessary. reader close listeners already
> ensure purging from the map, so I don't think the weak map serves any
> purpose today. The only possible advantage it has is to allow you to GC
> fieldcaches when you are already leaking readers... it could just be a
> regular map IMO.
>
>
>
> On Thu, Jan 29, 2015 at 9:35 AM, Uwe Schindler <u...@thetaphi.de> wrote:
>
> Hi,
>
> parts of your suggestions are already done in Lucene 4+. For one part I can
> tell you:
>
> weakhashmap,hashmap , synchronized problem
>
> 1. FieldCacheImpl use weakhashmap to manage field value cache,it has memory
> leak BUG.
>
> 2. sorlInputDocunent use a lot of hashmap,linkhashmap for field,that weast a
> lot of memory
>
> 3. AttributeSource use weakhashmap to cache class impl,and use a global
> synchronized reduce performance
>
> 4. AttributeSource is a base class , NumbericField extends
> AttributeSource,but they create a lot of hashmap,but NumbericField never use
> it .
>
> 5. all of this ,JVM GC take a lot of burder for the never used hashmap.
>
> All Lucene items no longer apply:
>
> 1.       FieldCache is gone and is no longer supported in Lucene 5. You
> should use the new DocValues index format for that (column based storage,
> optimized for sorting, numeric). You can still use Lucene’s
> UninvertingReader, bus this one has no weak maps anymore because it is no
> cache.
>
> 2.       No idea about that one - its unrelated to Lucene
>
> 3.       AttributeSource no longer uses this, since Lucene 4.8 it uses Java
> 7’s java.lang.ClassValue to attach the implementation class to the
> interface. No concurrency problems anymore. It also uses MethodHandles to
> invoke the attribute classes.
>
> 4.       NumericField no longer exists, the base class does not use
> AttributeSource. All field instances now automatically reuse the inner
> TokenStream instances across fields, too!
>
> 5.       See above
>
> In addition, Lucene has much better memory use, because terms are no longer
> UTF-16 strings and are in large shared byte arrays. So a lot of those other
> “optimizations” are handled in a different way in Lucene 4 and Lucene 5
> (coming out the next few days).
>
> Uwe
>
> -----
>
> Uwe Schindler
>
> H.-H.-Meier-Allee 63, D-28213 Bremen
>
> http://www.thetaphi.de
>
> eMail: u...@thetaphi.de
>
>
>
> From: yannianmu(母延年) [mailto:yannia...@tencent.com]
> Sent: Thursday, January 29, 2015 12:59 PM
> To: general; dev; commits
> Subject: Our Optimize Suggestions on lucene 3.5
>
>
>
>
>
>
>
> Dear Lucene dev
>
>     We are from the the Hermes team. Hermes is a project base on lucene 3.5
> and solr 3.5.
>
> Hermes process 100 billions documents per day,2000 billions document for
> total days (two month). Nowadays our single cluster index size is over then
> 200Tb,total size is 600T. We use lucene for the big data warehouse  speed up
> .reduce the analysis response time, for example filter like this age=32 and
> keywords like 'lucene'  or do some thing like count ,sum,order by group by
> and so on.
>
>
>
>     Hermes could filter a data form 1000billions in 1 secondes.10billions
> data`s order by taken 10s,10billions data`s group by thaken 15 s,10 billions
> days`s sum,avg,max,min stat taken 30 s
>
> For those purpose,We made lots of improve base on lucene and solr , nowadays
> lucene has change so much since version 4.10, the coding has change so
> much.so we don`t want to commit our code to lucene .only to introduce our
> imporve base on luene 3.5,and introduce how hermes can process 100billions
> documents per day on 32 Physical Machines.we think it may be helpfull for
> some people who have the similary sense .
>
>
>
>
>
>
>
> First level index(tii),Loading by Demand
>
> Original:
>
> 1. .tii file is load to ram by TermInfosReaderIndex
>
> 2. that may quite slowly by first open Index
>
> 3. the index need open by Persistence,once open it ,nevel close it.
>
> 4. this cause will limit the number of the index.when we have thouthand of
> index,that will Impossible.
>
> Our improve:
>
> 1. Loading by Demand,not all fields need to load into memory
>
> 2. we modify the method getIndexOffset(dichotomy) on disk, not on memory,but
> we use lru cache to speed up it.
>
> 3. getIndexOffset on disk can save lots of memory,and can reduce times when
> open a index
>
> 4. hermes often open different index for dirrerent Business; when the index
> is not often to used ,we will to close it.(manage by lru)
>
> 5. such this my 1 Physical Machine can store over then 100000 number of
> index.
>
> Solve the problem:
>
> 1. hermes need to store over then 1000billons documents,we have not enough
> memory to store the tii file
>
> 2. we have over then 100000 number of index,if all is opend ,that will weast
> lots of file descriptor,the file system will not allow.
>
>
>
> Build index on Hdfs
>
> 1. We modifyed lucene 3.5 code at 2013.so that we can build index direct on
> hdfs.(lucene has support hdfs since 4.0)
>
> 2. All the offline data is build by mapreduce on hdfs.
>
> 3. we move all the realtime index from local disk to hdfs
>
> 4. we can ignore disk failure because of index on hdfs
>
> 5. we can move process from on machine to another machine on hdfs
>
> 6. we can quick recover index when a disk failure happend .
>
> 7. we does need recover data when a machine is broker(the Index is so big
> move need lots of hours),the process can quick move to other machine by
> zookeeper heartbeat.
>
> 8. all we know index on hdfs is slower then local file system,but why ?
> local file system the OS make so many optimization, use lots cache to speed
> up random access. so we also need a optimization on hdfs.that is why some
> body often said that hdfs index is so slow the reason is that you didn`t
> optimize it .
>
> 9. we split the hdfs file into fix length block,1kb per block.and then use a
> lru cache to cache it ,the tii file and some frequent terms will speed up.
>
> 10. some hdfs file does`t need to close Immediately we make a lru cache to
> cache it ,to reduce the frequent of open file.
>
>
>
> Improve solr, so that one core can dynamic process multy index.
>
> Original:
>
> 1. a solr core(one process) only process 1~N index by solr config
>
> Our improve:
>
> 2. use a partion like oracle or hadoop hive.not build only one big
> index,instand build lots of index by day(month,year,or other partion)
>
> 3. dynamic create table for dynamic businiss
>
> Solve the problem:
>
> 1. to solve the index is to big over then Interger.maxvalue, docid overflow
>
> 2. some times the searcher not need to search all of the data ,may be only
> need recent 3 days.
>
>
>
> Label mark technology for doc values
>
> Original:
>
> 1. group by,sort,sum,max,min ,avg those stats method need to read Original
> from tis file
>
> 2. FieldCacheImpl load all the term values into memory for solr
> fieldValueCache,Even if i only stat one record .
>
> 3. first time search is quite slowly because of to build the fieldValueCache
> and load all the term values into memory
>
> Our improve:
>
> 1. General situation,the data has a lot of repeat value,for exampe the sex
> file ,the age field .
>
> 2. if we store the original value ,that will weast a lot of storage.
> so we make a small modify at TermInfosWriter, Additional add a new filed
> called termNumber.
> make a unique term sort by term through TermInfosWriter, and then gave each
> term a unique  Number from begin to end  (mutch like solr UnInvertedField).
>
> 3. we use termNum(we called label) instead of Term.we store termNum(label)
> into a file called doctotm. the doctotm file is order by docid,lable is
> store by fixed length. the file could be read by random read(like fdx it
> store by fixed length),the file doesn`t need load all into memory.
>
> 4. the label`s order is the same with terms order .so if we do some
> calculation like order by or group by only read the label. we don`t need to
> read the original value.
>
> 5. some field like sex field ,only have 2 different values.so we only use 2
> bits(not 2 bytes) to store the label, it will save a lot of Disk io.
>
> 6. when we finish all of the calculation, we translate label to Term by a
> dictionary.
>
> 7. if a lots of rows have the same original value ,the original value we
> only store once,onley read once.
>
> Solve the problem:
>
> 1. Hermes`s data is quite big we don`t have enough memory to load all Values
> to memory like lucene FieldCacheImpl or solr UnInvertedField.
>
> 2. on realtime mode ,data is change Frequent , The cache is invalidated
> Frequent by append or update. build FieldCacheImpl will take a lot of times
> and io;
>
> 3. the Original value is lucene Term. it is a string type.  whene sortring
> or grouping ,thed string value need a lot of memory and need lot of cpu time
> to calculate hashcode \compare \equals ,But label is number  is fast.
>
> 4. the label is number ,it`s type mabbe short ,or maybe byte ,or may be
> integer whitch depending on the max number of the label.
>
> 5. read the original value will need lot of io, need iterate tis file.even
> though we just need to read only docunent.
>
> 6. Solve take a lot of time when first build FieldCacheImpl.
>
>
>
>
>
> two-phase search
>
> Original:
>
> 1. group by order by use original value,the real value may be is a string
> type,may be more larger ,the real value maybe  need a lot of io  because of
> to read tis,frq file
>
> 2. compare by string is slowly then compare by integer
>
> Our improve:
>
> 1. we split one search into multy-phase search
>
> 2. the first search we only search the field that use for order by ,group by
>
> 3. the first search we doesn`t need to read the original value(the real
> value),we only need to read the docid and label(see < Label mark technology
> for doc values>) for order by group by.
>
> 4. when we finish all the order by and group by ,may be we only need to
> return Top n records .so we start next to search to get the Top n records
> original value.
>
> Solve the problem:
>
> 1. reduce io ,read original take a lot of disk io
>
> 2. reduce network io (for merger)
>
> 3. most of the field has repeated value, the repeated only need to read once
>
> the group by filed only need to read the origina once by label whene display
> to user.
>
> 4. most of the search only need to display on Top n (n<=100) results, so use
> to phrase search some original value could be skip.
>
>
>
>
>
> multy-phase indexing
>
> 1. hermes doesn`t update index one by one,it use batch index
>
> 2. the index area is split into four area ,they are called doclist=>buffer
> index=>ram index=>diskIndex/hdfsIndex
>
> 3. doclist only store the solrinputdocument for the batch update or append
>
> 4. buffer index is a ramdirectory ,use for merge doclist to index.
>
> 5. ram index is also a ramdirector ,but it is biger then buffer index, it
> can be search by the user.
>
> 6. disk/hdfs index is Persistence store use for big index
>
> 7. we also use wal called binlog(like mysql binlog) for recover
>
>
>
>
>
> two-phase commit for update
>
> 1. we doesn`t update record once by once like solr(solr is search by
> term,found the document,delete it,and then append a new one),one by one is
> slowly.
>
> 2. we need Atomic inc field ,solr that can`t support ,solr only support
> replace field value.
> Atomic inc field need to read the last value first ,and then increace it`s
> value.
>
> 3. hermes use pre mark delete,batch commit to update a document.
>
> 4. if a document is state is premark ,it also could be search by the
> user,unil we commit it.
> we modify SegmentReader ,split deletedDocs into to 3 part. one part is
> called deletedDocstmp whitch is for pre mark (pending delete),another one is
> called deletedDocs_forsearch which is for index search, another is also call
> deletedDocs
>
> 5. once we want to pending delete a document,we operate deletedDocstmp (a
> openbitset)to mark one document is pending delete.
>
> and then we append our new value to doclist area(buffer area)
>
> the pending delete means user also could search the old value.
>
> the buffer area means user couldn`t search the new value.
>
> but when we commit it(batch)
>
> the old value is realy droped,and flush all the buffer area to Ram area(ram
> area can be search)
>
> 6. the pending delete we called visual delete,after commit it we called
> physics delete
>
> 7. hermes ofthen visula delete a lots of document ,and then commit once ,to
> improve up the Performance one by one
>
> 8. also we use a lot of cache to speed up the atomic inc field.
>
>
>
>
>
>
>
> Term data skew
>
> Original:
>
> 1. lucene use inverted index to store term and doclist.
>
> 2. some filed like sex  has only to value male or female, so male while have
> 50% of doclist.
>
> 3. solr use filter cache to cache the FQ,FQ is a openbitset which store the
> doclist.
>
> 4. when the firest time to use FQ(not cached),it will read a lot of doclist
> to build openbitset ,take a lot of disk io.
>
> 5. most of the time we only need the TOP n doclist,we dosn`t care about the
> score sort.
>
>
>
> Our improve:
>
> 1. we often combination other fq,to use the skip doclist to skip the docid
> that not used( we may to seed the query methord called advance)
>
> 2. we does`n cache the openbitset by FQ ,we cache the frq files block into
> memeory, to speed up the place often read.
>
> 3. our index is quite big ,if we cache the FQ(openbitset),that will take a
> lots of memory
>
> 4. we modify the indexSearch  to support real Top N search and ignore the
> doc score sort
>
>
>
> Solve the problem:
>
> 1. data skew take a lot of disk io to read not necessary doclist.
>
> 2. 2000billions index is to big,the FQ cache (filter cache) user openbitset
> take a lot of memor
>
> 3. most of the search ,only need the top N result ,doesn`t need score
> sort,we need to speed up the search time
>
>
>
>
>
>
>
> Block-Buffer-Cache
>
> Openbitset,fieldvalueCache need to malloc a big long[] or int[] array. it is
> ofen seen by lots of cache ,such as
> UnInvertedField,fieldCacheImpl,filterQueryCache and so on. most of time
> much of the elements is zero(empty),
>
> Original:
>
> 1. we create the big array directly,when we doesn`t neet we drop it to JVM
> GC
>
> Our improve:
>
> 1. we split the big arry into fix length block,witch block is a small
> array,but fix 1024 length .
>
> 2. if a block `s element is almost empty(element is zero),we use hashmap to
> instead of array
>
> 3. if a block `s non zero value is empty(length=0),we couldn`t create this
> block arrry only use a null to instead of array
>
> 4. when the block is not to use ,we collectoion the array to buffer ,next
> time we reuse it
>
> Solve the problem:
>
> 1. save memory
>
> 2. reduce the jvm Garbage collection take a lot of cpu resource.
>
>
>
>
>
> weakhashmap,hashmap , synchronized problem
>
> 1. FieldCacheImpl use weakhashmap to manage field value cache,it has memory
> leak BUG.
>
> 2. sorlInputDocunent use a lot of hashmap,linkhashmap for field,that weast a
> lot of memory
>
> 3. AttributeSource use weakhashmap to cache class impl,and use a global
> synchronized reduce performance
>
> 4. AttributeSource is a base class , NumbericField extends
> AttributeSource,but they create a lot of hashmap,but NumbericField never use
> it .
>
> 5. all of this ,JVM GC take a lot of burder for the never used hashmap.
>
>
>
> Our improve:
>
> 1. weakhashmap is not high performance ,we use softReferance instead of it
>
> 2. reuse NumbericField avoid create AttributeSource frequent
>
> 3. not use global synchronized
>
>
>
> when we finish this optimization our process,speed up from 20000/s to
> 60000/s (1k per document).
>
>
>
>
>
>
>
> Other GC optimization
>
> 1. reuse byte[] arry in the inputbuffer ,outpuer buffer .
>
> 2. reuse byte[] arry in the RAMfile
>
> 3. remove some finallze method, the not necessary.
>
> 4. use StringHelper.intern to reuse the field name in solrinputdocument
>
>
>
>
>
> Directory optimization
>
> 1. index commit doesn`t neet sync all the field
>
> 2. we use a block cache on top of FsDriectory and hdfsDirectory to speed up
> read sppedn
>
> 3. we close index or index file that not often to used.also we limit the
> index that allow max open;block cache is manager by LRU
>
>
>
>
>
> network optimization
>
> 1. optimization ThreadPool in searchHandle class ,some times does`t need
> keep alive connection,and increate the timeout time for large Index.
>
> 2. remove jetty ,we write socket by myself ,jetty import data is not high
> performance
>
> 3. we change the data import form push mode to pull mode with like apache
> storm.
>
>
>
> append mode,optimization
>
> 1. append mode we doesn`t store the field value to fdt file.that will take a
> lot of io on index merger, but it is doesn`t need.
>
> 2. we store the field data to a single file ,the files format is hadoop
> sequence file ,we use LZO compress to save io
>
> 3. we make a pointer to point docid to sequencefile
>
>
>
>
>
> non tokenizer field optimization
>
> 1. non tokenizer field we doesn`t store the field value to fdt field.
>
> 2. we read the field value from label (see  <<Label mark technology for doc
> values>>)
>
> 3. most of the field has duplicate value,this can reduce the index file size
>
>
>
>
>
> multi level of merger server
>
> 1. solr can only use on shard to act as a merger server .
>
> 2. we use multi level of merger server to merge all shards result
>
> 3. shard on the same mathine have the high priority to merger by the same
> mathine merger server.
>
> solr`s merger is like this
>
>
>
> hermes`s merger is like this
>
> other optimize
>
> 1. hermes support Sql .
>
> 2. support union Sql from different tables;
>
> 3. support view table
>
>
>
>
>
>
>
>
>
>
>
> finallze
>
> Hermes`sql may be like this
>
> l select
> higo_uuid,thedate,ddwuid,dwinserttime,ddwlocaltime,dwappid,dwinituserdef1,dwclientip,sclientipv6,dwserviceip,dwlocaiip,dwclientversion,dwcmd,dwsubcmd,dwerrid,dwuserdef1,dwuserdef2,dwuserdef3,dwuserdef4,cloglevel,szlogstr
> from sngsearch06,sngsearch09,sngsearch12 where thedate in ('20140917') and
> ddwuin=5713 limit 0,20
>
>
>
> l select thedate,ddwuin,dwinserttime,ddwlocaltime from sngsearch12 where
> thedate in ('20140921') and ddwuin=5713 order by ddwlocaltime desc  limit
> 0,10
>
> l select count(*),count(ddwuid) from sngsearch03 where thedate=20140921
> limit 0,100
>
> l select sum(acnt),average(acnt),max(acnt),min(acnt) from sngsearch03 where
> thedate=20140921  limit 0,100
>
> l select thedate,ddwuid,sum(acnt),count(*) from sngsearch18 where thedate in
> (20140908) and ddwuid=7823 group by thedate,ddwuid limit 0,100;
>
> l select count(*) from guangdiantong where thedate ='20141010' limit 0,100
>
> l select freqtype,fspenttime,fmodname,yyyymmddhhmmss,hermestime,freqid from
> guangdiantong where thedate ='20141010' limit 0,100
>
> l select freqtype,fspenttime,fmodname,yyyymmddhhmmss,hermestime,freqid from
> guangdiantong where thedate ='20141010' order by yyyymmddhhmmss desc  limit
> 0,10
>
> l
>
> l select miniute1,count(*) from guangdiantong where thedate ='20141010'
> group by miniute1 limit 0,100
>
> l select miniute5,count(*) from guangdiantong where thedate ='20141010'
> group by miniute5 limit 0,100
>
> l select hour,miniute15,count(*) from guangdiantong where thedate
> ='20141010' group by hour,miniute15 order by miniute15 desc limit 0,100
>
> l select
> hour,count(*),sum(fspenttime),average(fspenttime),average(ferrorcode) from
> guangdiantong where thedate ='20141010' and freqtype=1  group by hour limit
> 0,100
>
> l select freqtype,count(*),sum(fspenttime),average(fspenttime) from
> guangdiantong where thedate ='20141010' and (freqtype>=10000 and
> freqtype<=10100) group by freqtype limit 0,100
>
> l select freqtype,count(*),sum(fspenttime),average(fspenttime) from
> guangdiantong where thedate ='20141010' and (freqtype>=10000 and
> freqtype<=10100) group by freqtype order by average(fspenttime) desc limit
> 0,100
>
> l
>
> l select hour,miniute15,count(*),sum(fspenttime),average(fspenttime) from
> guangdiantong where thedate ='20141010' group by hour,miniute15 order by
> miniute15 desc limit 0,100
>
> l
>
> l select
> thedate,yyyymmddhhmmss,miniute1,miniute5,miniute15,hour,hermestime,freqtype,freqname,freqid,fuid,fappid,fmodname,factionname,ferrorcode,ferrormsg,foperateret,ferrortype,fcreatetime,fspenttime,fserverip,fversion
> from guangdiantong where thedate ='20141010' order by yyyymmddhhmmss desc
> limit 0,100
>
>
>
>
>
> ________________________________
>
> yannianmu(母延年)
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to