Hi Karl! I suggest that you put the point data you need in BinaryDocValues. That is both the x & y into the same byte[] chunk. I've done this for a Solr integration in https://issues.apache.org/jira/browse/SOLR-5170
~ David karl.wright-2 wrote > Hi All (and especially Robert), > > Lucene NumericDocValues seems to operate slower than we would expect. In > our application, we're using it for storing coordinate values, which we > retrieve to compute a distance. While doing timings trying to determine > the impact of including a sqrt in the calculation, we noted that the > lucene overhead itself overwhelmed pretty much anything we did in the > ValueSource. > > One of our engineers did performance testing (code attached, hope it gets > through), which shows what we are talking about. Please see the thread > below. The question is: why is lucene 2.5x slower than a direct buffer > access for this case? And is there anything we can do in the Lucene > paradigm to get our performance back closer to the direct buffer case? > > Karl > > -----Original Message----- > From: Ziech Christian (HERE/Berlin) > Sent: Tuesday, October 08, 2013 9:08 AM > To: Wright Karl (HERE/Cambridge) > Subject: AW: Is there a really performant way to store a full 32-bit int > in doc values? > > Hi, > > I have tested now the approach with usind the NumericDocValues directly > and it indeed helps about 20% compared to the original Lucene numbers - > Lucene is still 2,5x slower than using a DirectBuffer alone but it helps. > The funny thing is really that with lucene using the SquareRoot is almost > meaningless which can be explained well by the CPU calculating the > SquareRoot while other things are computated and since it doesn't need the > result for a while in my micro-Benchmark it can happily do other things in > the meantime. Since we also have a lot of other query aspects we'd get > that gain either way I assume so calculating about 30-50ms for the square > root for the scoring 25M documents should be about accurate. So what is > lucene doing that causes it to be 3 times slower than the naive approach. > And why is that impact compared to the one of a simple square root > (slowing down things by ~20% when assuming the 30ms with more complex > actions) so big? I mean 20% vs 200% is a magnitude! > As a side note: Storing the values as a int when using a DirectBuffer > doesn't seem helpful - I assume because we have to cast the in to float > either way later. > > BR > Christian > > PS: The new numbers are: > Scoring 25000000 documents with direct float buffers (without square root) > took 190 > > Scoring 25000000 documents with direct float buffers (without square root) > took 171 > > Scoring 25000000 documents with direct float buffers (without square root) > took 172 > > Scoring 25000000 documents with direct float buffers (and a square root) > took 281 > > Scoring 25000000 documents with direct float buffers (and a square root) > took 280 > > Scoring 25000000 documents with direct float buffers (and a square root) > took 266 > > Scoring 25000000 documents with a lucene float value source (without > square root) took 1045 > > Scoring 25000000 documents with a lucene float value source (without > square root) took 625 > > Scoring 25000000 documents with a lucene float value source (without > square root) took 630 > > Scoring 25000000 documents with a lucene float value source (and a square > root) took 661 > > Scoring 25000000 documents with a lucene float value source (and a square > root) took 670 > > Scoring 25000000 documents with a lucene float value source (and a square > root) took 665 > > Scoring 25000000 documents with direct int buffers (without square root) > took 218 > > Scoring 25000000 documents with direct int buffers (without square root) > took 219 > > Scoring 25000000 documents with direct int buffers (without square root) > took 204 > > Scoring 25000000 documents with a lucene numeric values (without square > root) source took 1123 > > Scoring 25000000 documents with a lucene numeric values (without square > root) source took 500 > > Scoring 25000000 documents with a lucene numeric values (without square > root) source took 499 > > Scoring 25000000 documents with a lucene numeric values (and a square > root) source took 531 > > Scoring 25000000 documents with a lucene numeric values (and a square > root) source took 531 > > Scoring 25000000 documents with a lucene numeric values (and a square > root) source took 535 > > > ________________________________________ > Von: Wright Karl (HERE/Cambridge) > Gesendet: Montag, 7. Oktober 2013 09:22 > An: Ziech Christian (HERE/Berlin) > Betreff: FW: Is there a really performant way to store a full 32-bit int > in doc values? > > -----Original Message----- > From: ext Michael McCandless [mailto: > lucene@ > ] > Sent: Monday, October 07, 2013 8:28 AM > To: Wright Karl (HERE/Cambridge) > Subject: Re: Is there a really performant way to store a full 32-bit int > in doc values? > > Well, it is a micro-benchmark ... so it'd be better to test in the > wider/full context of the application? > > I'm also a little worried that you go through ValueSource instead of > interacting directly with the NumericDocValues instance; it's just an > additional level of indirection that may confuse hotspot. But it really > ought not be so bad ... > > Under the hood we encode a float to an int using Float.floatToRawIntBits; > it could be that this doesn't work well w/ the compression we then do on > the ints by default? I'm curious which impl the Lucene45DocValuesConsumer > is using in your case. Looks like you are using random floats, so I'd > expect it's using DELTA_COMPRESSED. > > It'd be a simple test to just make your own DVFormat using raw 32 bit > ints, to see how much that helps. > > But, yes, I would just email the list and see if there are other ideas? > > Mike McCandless > > http://blog.mikemccandless.com > > > On Mon, Oct 7, 2013 at 7:14 AM, < > karl.wright@ > > wrote: >> Hi Mike, >> >> >> >> Before I post to the general list, do you see any problem with our >> testing methodology? >> >> >> >> Basically, we conclude that by far the most expensive thing is >> retrieving the NumericDocValue value. This currently overwhelms any >> expensive operations we might do in the scoring ourselves, which is >> why we're looking for potential improvements in that area. >> >> >> >> Do you agree with the assessment? >> >> Karl >> >> >> >> From: Ziech Christian (HERE/Berlin) >> Sent: Friday, October 04, 2013 11:09 PM >> To: Wright Karl (HERE/Cambridge) >> Subject: AW: Is there a really performant way to store a full 32-bit >> int in doc values? >> >> >> >> Hi, >> >> maybe it's best if I share where I got my numbers from - I have >> written a small test (which originally should only test the >> Math.sqrt() impact for 10M scorings). >> >> The output is (I looped over the search invocation to give lucene a >> chance to load everything): >> Scoring 25000000 documents with direct buffers (without square root) >> took >> 203 >> Scoring 25000000 documents with direct buffers (without square root) >> took >> 179 >> Scoring 25000000 documents with direct buffers (without square root) >> took >> 172 >> Scoring 25000000 documents with direct buffers (and a square root) >> took 292 Scoring 25000000 documents with direct buffers (and a square >> root) took 289 Scoring 25000000 documents with direct buffers (and a >> square root) took 289 Scoring 25000000 documents with a lucene value >> (without square root) source took 1045 Scoring 25000000 documents with >> a lucene value (without square root) source took 656 Scoring 25000000 >> documents with a lucene value (without square root) source took 660 >> Scoring 25000000 documents with a lucene value (without square root) >> source took 658 Scoring 25000000 documents with a lucene value >> (without square root) source took 663 Scoring 25000000 documents with >> a lucene value (and a square root) source took 711 Scoring 25000000 >> documents with a lucene value (and a square root) source took 710 >> Scoring 25000000 documents with a lucene value (and a square root) >> source took 713 Scoring 25000000 documents with a lucene value (and a >> square root) source took 711 Scoring 25000000 documents with a lucene >> value (and a square root) source took 714 >> >> So the impact of a square root is roughly 110ms while the impact of >> using the lucene function values is far higher (depending on the run >> between 300-350ms). Interstingly the square root impact is not as high >> on the lucene function query for some reason (most likely java or the >> cpu can just optimize the very simple scorer best). >> >> I did measure the values with a FSDirectory and a RAMDirectory which >> both essentially yield the same performance. Do you see any problem >> with the attached code? >> >> BR >> Christian >> >> ________________________________ >> >> Von: Wright Karl (HERE/Cambridge) >> Gesendet: Freitag, 4. Oktober 2013 20:56 >> An: Ziech Christian (HERE/Berlin) >> Betreff: FW: Is there a really performant way to store a full 32-bit >> int in doc values? >> >> >> FYI >> Karl >> >> Sent from my Windows Phone >> >> ________________________________ >> >> From: ext Michael McCandless >> Sent: 10/4/2013 4:51 PM >> To: Wright Karl (HERE/Cambridge) >> Subject: Re: Is there a really performant way to store a full 32-bit >> int in doc values? >> >> Hmmm, that's interesting that you see decode cost is too high. Are >> you sure? >> >> Can you email the list? I'm sure Rob will have suggestions. The >> worst case is you make a custom DV format that stores things raw. >> >> 4.5 has a new default DocValuesFormat with more compression, but with >> values stored on disk by default (cached by the OS if you have the >> RAM) ... I wonder how that would compare to what you're using now. >> >> I think the simplest thing to do is to instantiate the >> Lucene42DocValuesConsumer (renamed to MemoryDVConsumer in 4.5), >> passing a very high acceptableOverheadRatio? This should caused >> packed ints to upgraded to a byte[], short[], int[], long[]. If this >> is still not fast enough then I suspect a custom DVFormat that just >> uses int[] directly (avoiding the abstractions of packed ints) is your >> best shot. >> >> Mike McCandless >> >> http://blog.mikemccandless.com >> >> >> On Fri, Oct 4, 2013 at 8:46 AM, < > karl.wright@ > > wrote: >>> >>> >>> Hi Mike, >>> >>> >>> >>> We're using docvalues to store geocoordinates in meters in X,Y,Z >>> space, and discovering that they are taking more time to unpack than >>> we'd like. I was surprised to find no raw representation available >>> for docvalues right now >>> - >>> otherwise, a fixed 4-byte representation would have been ideal. Would >>> you have any suggestions? >>> >>> >>> >>> Karl >>> >>> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: > dev-unsubscribe@.apache > For additional commands, e-mail: > dev-help@.apache > > LuceneFloatSourceTest.java (16K) > <http://lucene.472066.n3.nabble.com/attachment/4094104/0/LuceneFloatSourceTest.java> ----- Author: http://www.packtpub.com/apache-solr-3-enterprise-search-server/book -- View this message in context: http://lucene.472066.n3.nabble.com/FW-Is-there-a-really-performant-way-to-store-a-full-32-bit-int-in-doc-values-tp4094104p4094120.html Sent from the Lucene - Java Developer mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org For additional commands, e-mail: dev-h...@lucene.apache.org