Reduce calls to RandomAccessFile.setLength in NIOFileHandle#15
Reduce calls to RandomAccessFile.setLength in NIOFileHandle#15sbesson merged 2 commits intoome:masterfrom
Conversation
|
Sorry for the delay @melissalinkert, slowly getting back to this. Is there a minimal example consuming the |
|
I'd expect that something as simple as: would be noticeably faster with this PR. |
|
The code looks good and the solution is effective without being a major overhaul. Testing using the sample code suggested provides a substantial improvement in performance. Without the PR: With the PR: |
sbesson
left a comment
There was a problem hiding this comment.
Looks good and should be ready to merge. In terms of integration:
- one question about the impact of propagation of this feature up the stack
- more generally, in order to cut a new
ome-commonrelease, we should agree on whether the changes made in #12 should be supplemented with some backwards compatible API - see https://trello.com/c/Ym1HWlQG/159-ome-common-location-exception /cc @dgault
| /** The original length of the file. */ | ||
| private Long defaultLength; | ||
|
|
||
| private long effectiveLength; |
There was a problem hiding this comment.
Am I correct in assuming that the addition of a private field means this would break serialization when propagated up to the Bio-Formats stack
There was a problem hiding this comment.
Not necessarily - readers shouldn't be caching open file handles, so I wouldn't think instances of NIOFileHandle would be present in memo files. For example:
Probably merits a test before bumping the ome-common version number in Bio-Formats though, to be safe.
|
Using the following and running From an integration perspective, this makes this PR eligible for an inclusion in a patch release of Bio-Formats. The main issue is the ongoing discussion on #12 (see https://trello.com/c/Ym1HWlQG/159-ome-common-location-exception) and the fact more discussion/configuration might be required before propagating the latter changes. In order to move forward, my proposal would be to revert #12, merge this into |
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#824 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/824/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#518 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/518/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#825 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/825/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#826 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/826/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#519 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/519/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#827 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/827/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#520 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/520/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#828 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/828/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#521 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/521/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#829 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/829/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#522 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/522/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#834 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/834/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#527 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/527/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#835 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/835/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#528 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/528/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#836 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/836/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#529 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/529/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#837 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/837/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#530 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/530/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#838 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/838/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#531 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/531/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#839 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/839/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#532 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/532/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#840 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/840/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#533 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/533/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#841 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/841/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#534 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/534/)
Repository: ome/ome-common-java Already up-to-date. Merged PRs: # PR 16 rleigh-codelibre 'Java 9 build support' # PR 21 melissalinkert 'Revert PR ome#15' Generated by OME-FILES-CPP-DEV-merge-push-superbuild#842 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-merge-push-superbuild/842/)
Repository: ome/ome-common-java Excluded PRs: # PR 21 melissalinkert 'Revert PR ome#15' (user: melissalinkert) # PR 16 rleigh-codelibre 'Java 9 build support' (user: rleigh-codelibre) Already up-to-date. Generated by OME-FILES-CPP-DEV-breaking-push-superbuild#535 (https://ci.openmicroscopy.org/job/OME-FILES-CPP-DEV-breaking-push-superbuild/535/)
Instead of calling
raf.setLengthwith the exact length required for the current write, this increases the length byNIOFileHandle.getBufferSize()in anticipation of future writes.NIOFileHandle.close()then reconciles any discrepancy between the actual and expected file lengths, so that there are no extra bytes in the file. This was the least invasive change I could think of, but happy to discuss if anyone has other thoughts.See https://trac.openmicroscopy.org/ome/ticket/6931 and https://trello.com/c/OimiHAQY/175-profile-tiff-writing-on-windows. This does have a noticeable impact on the performance of
bfconverton Windows; in the test case on the ticket, local Windows times are now down to ~52s vs ~95s.