[ 
https://issues.apache.org/jira/browse/LUCENE-7583?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15733619#comment-15733619
 ] 

Daniel Collins commented on LUCENE-7583:
----------------------------------------

Note: this breaks my eclipse build (on 6x at least, and I presume master) 
because 
lucene/core/src/java/org/apache/lucene/util/GrowableByteArrayDataOutput.java 
claims to be in package org.apache.lucene.store, but is actually in the util 
dir.

Ant compile is fine, but I guess Eclipse is more pedantic.

> Can we improve OutputStreamIndexOutput's byte buffering when writing each BKD 
> leaf block?
> -----------------------------------------------------------------------------------------
>
>                 Key: LUCENE-7583
>                 URL: https://issues.apache.org/jira/browse/LUCENE-7583
>             Project: Lucene - Core
>          Issue Type: Improvement
>            Reporter: Michael McCandless
>             Fix For: master (7.0), 6.4
>
>         Attachments: LUCENE-7583-hardcode-writeVInt.patch, 
> LUCENE-7583.fork-FastOutputStream.patch, LUCENE-7583.patch, 
> LUCENE-7583.patch, LUCENE-7583.private-IndexOutput.patch
>
>
> When BKD writes its leaf blocks, it's essentially a lot of tiny writes (vint, 
> int, short, etc.), and I've seen deep thread stacks through our IndexOutput 
> impl ({{OutputStreamIndexOutput}}) when pulling hot threads while BKD is 
> writing.
> So I tried a small change, to have BKDWriter do its own buffering, by first 
> writing each leaf block into a {{RAMOutputStream}}, and then dumping that (in 
> 1 KB byte[] chunks) to the actual IndexOutput.
> This gives a non-trivial reduction (~6%) in the total time for BKD writing + 
> merging time on the 20M NYC taxis nightly benchmark (2 times each):
> Trunk, sparse:
>   - total: 64.691 sec
>   - total: 64.702 sec
> Patch, sparse:
>   - total: 60.820 sec
>   - total: 60.965 sec
> Trunk dense:
>   - total: 62.730 sec
>   - total: 62.383 sec
> Patch dense:
>   - total: 58.805 sec
>   - total: 58.742 sec
> The results seem to be consistent and reproducible.  I'm using Java 1.8.0_101 
> on a fast SSD on Ubuntu 16.04.
> It's sort of weird and annoying that this helps so much, because 
> {{OutputStreamIndexOutput}} already uses java's {{BufferedOutputStream}} 
> (default 8 KB buffer) to buffer writes.
> [~thetaphi] suggested maybe hotspot is failing to inline/optimize the 
> {{writeByte}} / the call stack just has too many layers.
> We could commit this patch (it's trivial) but it'd be nice to understand and 
> fix why buffering writes is somehow costly so any other Lucene codec 
> components that write lots of little things can be improved too.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

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

Reply via email to