[ http://issues.apache.org/jira/browse/LUCENE-629?page=all ]
Michael Busch updated LUCENE-629: --------------------------------- Attachment: optimized_merge_compressed_fields.patch The patch file for this improvement (based on Lucene Rev. 419199) > Performance improvement for merging stored, compressed fields > ------------------------------------------------------------- > > Key: LUCENE-629 > URL: http://issues.apache.org/jira/browse/LUCENE-629 > Project: Lucene - Java > Issue Type: Improvement > Components: Index > Reporter: Michael Busch > Priority: Minor > Attachments: optimized_merge_compressed_fields.patch > > > Hello everyone, > currently the merging of stored, compressed fields is not optimal for the > following reason: every time a stored, compressed field is being merged, the > FieldsReader uncompresses the data, hence the FieldsWriter has to compress it > again when it writes the merged fields data (.fdt) file. The > uncompress/compress step is unneccessary and slows down the merge performance > significantly. > This patch improves the merge performance by avoiding the uncompress/compress > step. In the following I give an overview of the changes I made: > * Added a new FieldSelectorResult constant named "LOAD_FOR_MERGE" to > org.apache.lucene.document.FieldSelectorResult > * SegmentMerger now uses an FieldSelector to get stored fields from the > FieldsReader. This FieldSelector's accept() method returns the > FieldSelectorResult "LOAD_FOR_MERGE" for every field. > * Added a new inner class to FieldsReader named "FieldForMerge", which > extends org.apache.lucene.document.AbstractField. This class holds the field > properties and its data. If a field has the FieldSelectorResult > "LOAD_FOR_MERGE", then the FieldsReader creates an instance of > "FieldForMerge" and does not uncompress the field's data. > * FieldsWriter checks if the field it is about to write is an instanceof > FieldsReader.FieldForMerge. If true, then it does not compress the field data. > To test the performance I index about 350,000 text files and store the raw > text in a stored, compressed field in the lucene index. I use a merge factor > of 10. The final index has a size of 366MB. After building the index, I > optimize it to measure the pure merge performance. > Here are the performance results: > old version: > * Time for Indexing: 36.7 minutes > * Time for Optimizing: 4.6 minutes > patched version: > * Time for Indexing: 20.8 minutes > * Time for Optimizing: 0.5 minutes > The results show that the index build time improved by about 43%, and the > optimizing step is more than 8x faster. > A diff of the final indexes (old and patched version) shows, that they are > identical. Furthermore, all junit testcases succeeded with the patched > version. > Regards, > Michael Busch -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]