ASF Bugzilla – Attachment 37770 Details for
Bug 64322
Very poor performance reading OLE2
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Performance fix for OLE2 files with a large number of small entries
poi-performance-fix-for-OLE2-files-with-large-number-small-entries.patch (text/plain), 5.13 KB, created by
sits
on 2021-03-14 22:35:17 UTC
(
hide
)
Description:
Performance fix for OLE2 files with a large number of small entries
Filename:
MIME Type:
Creator:
sits
Created:
2021-03-14 22:35:17 UTC
Size:
5.13 KB
patch
obsolete
>Index: poi/poi/src/java/org/apache/poi/poifs/filesystem/POIFSMiniStore.java >IDEA additional info: >Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP ><+>UTF-8 >=================================================================== >--- poi/poi/src/java/org/apache/poi/poifs/filesystem/POIFSMiniStore.java (revision cee9eb7e2b487c4b451bd167e07e6309835a943b) >+++ poi/poi/src/java/org/apache/poi/poifs/filesystem/POIFSMiniStore.java (date 1615423514626) >@@ -64,20 +64,25 @@ > int bigBlockOffset = byteOffset % _filesystem.getBigBlockSize(); > > // Now locate the data block for it >- Iterator<ByteBuffer> it = _mini_stream.getBlockIterator(); >+ Iterator<Integer> it = _mini_stream.getBlockOffsetIterator(); > for(int i=0; i<bigBlockNumber; i++) { > it.next(); > } >- ByteBuffer dataBlock = it.next(); >- assert(dataBlock != null); >+ >+ try { >+ ByteBuffer dataBlock = _filesystem.getBlockAt(it.next()); >+ assert(dataBlock != null); > >- // Position ourselves, and take a slice >- dataBlock.position( >- dataBlock.position() + bigBlockOffset >- ); >- ByteBuffer miniBuffer = dataBlock.slice(); >- miniBuffer.limit(POIFSConstants.SMALL_BLOCK_SIZE); >- return miniBuffer; >+ // Position ourselves, and take a slice >+ dataBlock.position( >+ dataBlock.position() + bigBlockOffset >+ ); >+ ByteBuffer miniBuffer = dataBlock.slice(); >+ miniBuffer.limit(POIFSConstants.SMALL_BLOCK_SIZE); >+ return miniBuffer; >+ } catch (IOException e) { >+ throw new RuntimeException(e); >+ } > } > > /** >Index: poi/poi/src/java/org/apache/poi/poifs/filesystem/POIFSStream.java >IDEA additional info: >Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP ><+>UTF-8 >=================================================================== >--- poi/poi/src/java/org/apache/poi/poifs/filesystem/POIFSStream.java (revision cee9eb7e2b487c4b451bd167e07e6309835a943b) >+++ poi/poi/src/java/org/apache/poi/poifs/filesystem/POIFSStream.java (date 1615264885529) >@@ -96,6 +96,15 @@ > return new StreamBlockByteBufferIterator(startBlock); > } > >+ Iterator<Integer> getBlockOffsetIterator() { >+ if(startBlock == POIFSConstants.END_OF_CHAIN) { >+ throw new IllegalStateException( >+ "Can't read from a new stream before it has been written to" >+ ); >+ } >+ return new StreamBlockOffsetIterator(startBlock); >+ } >+ > /** > * Updates the contents of the stream to the new > * set of bytes. >@@ -140,11 +149,11 @@ > /** > * Class that handles a streaming read of one stream > */ >- private class StreamBlockByteBufferIterator implements Iterator<ByteBuffer> { >+ private class StreamBlockOffsetIterator implements Iterator<Integer> { > private final ChainLoopDetector loopDetector; > private int nextBlock; > >- StreamBlockByteBufferIterator(int firstBlock) { >+ StreamBlockOffsetIterator(int firstBlock) { > this.nextBlock = firstBlock; > try { > this.loopDetector = blockStore.getChainLoopDetector(); >@@ -157,26 +166,54 @@ > return nextBlock != POIFSConstants.END_OF_CHAIN; > } > >- public ByteBuffer next() { >+ public Integer next() { > if (!hasNext()) { > throw new NoSuchElementException("Can't read past the end of the stream"); > } > >- try { >- loopDetector.claim(nextBlock); >- ByteBuffer data = blockStore.getBlockAt(nextBlock); >- nextBlock = blockStore.getNextBlock(nextBlock); >- return data; >- } catch(IOException e) { >- throw new RuntimeException(e); >- } >- } >+ loopDetector.claim(nextBlock); >+ int currentBlock = nextBlock; >+ nextBlock = blockStore.getNextBlock(nextBlock); >+ return currentBlock; >+ } >+ >+ public void remove() { >+ throw new UnsupportedOperationException(); >+ } >+ } >+ >+ /** >+ * Class that handles a streaming read of one stream >+ */ >+ private class StreamBlockByteBufferIterator implements Iterator<ByteBuffer> { >+ private final StreamBlockOffsetIterator offsetIterator; >+ >+ StreamBlockByteBufferIterator(int firstBlock) { >+ offsetIterator = new StreamBlockOffsetIterator(firstBlock); >+ } >+ >+ public boolean hasNext() { >+ return offsetIterator.hasNext(); >+ } >+ >+ public ByteBuffer next() { >+ if (!hasNext()) { >+ throw new NoSuchElementException("Can't read past the end of the stream"); >+ } >+ >+ try { >+ return blockStore.getBlockAt(offsetIterator.next()); >+ } catch(IOException e) { >+ throw new RuntimeException(e); >+ } >+ } > >- public void remove() { >- throw new UnsupportedOperationException(); >- } >- } >+ public void remove() { >+ throw new UnsupportedOperationException(); >+ } >+ } > >+ > protected class StreamBlockByteBuffer extends OutputStream { > byte[] oneByte = new byte[1]; > ByteBuffer buffer;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 64322
:
37154
|
37155
|
37156
| 37770