Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce calls to RandomAccessFile.setLength in NIOFileHandle #15

Merged
merged 2 commits into from
Sep 25, 2017

Conversation

melissalinkert
Copy link
Member

Instead of calling raf.setLength with the exact length required for the current write, this increases the length by NIOFileHandle.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 bfconvert on Windows; in the test case on the ticket, local Windows times are now down to ~52s vs ~95s.

@sbesson
Copy link
Member

sbesson commented Sep 19, 2017

Sorry for the delay @melissalinkert, slowly getting back to this. Is there a minimal example consuming the loci.common.NIOFileHandle API that could be run on Linux and Windows with and without this PR to test its effect in isolation of Bio-Formats?

@melissalinkert
Copy link
Member Author

I'd expect that something as simple as:

NIOFileHandle out = new NIOFileHandle("test", "rw");
long byteCount = 1024 * 1024; // 1 MB
for (long i=0; i<byteCount; i++) {
  out.write(1);
}
out.close();

would be noticeably faster with this PR.

@dgault
Copy link
Member

dgault commented Sep 21, 2017

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:

1024 * 1024: Time elapsed: 11898 ms
2048 * 2048: Time elapsed: 36811 ms
4096 * 4096: Time elapsed: 147633 ms

With the PR:

1024 * 1024: Time elapsed: 2089 ms
2048 * 2048: Time elapsed: 7692 ms
4096 * 4096: Time elapsed: 31783 ms

@sbesson sbesson added this to the 5.4.0 milestone Sep 21, 2017
Copy link
Member

@sbesson sbesson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good and should be ready to merge. In terms of integration:

@@ -105,6 +105,8 @@
/** The original length of the file. */
private Long defaultLength;

private long effectiveLength;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:

https://github.com/openmicroscopy/bioformats/blob/develop/components/formats-api/src/loci/formats/FormatReader.java#L127

Probably merits a test before bumping the ome-common version number in Bio-Formats though, to be safe.

@sbesson
Copy link
Member

sbesson commented Sep 25, 2017

Using the following Makefile to build Bio-Formats with and without this PR:

BUILDDIR=/tmp/build

clean:
	rm -rf $(BUILDDIR)
	mkdir -p $(BUILDDIR)
	test -f bioformats-5.7.0.zip || wget https://downloads.openmicroscopy.org/bio-formats/5.7.0/artifacts/bioformats-5.7.0.zip
	test -f setlength-performance.zip || wget https://github.com/melissalinkert/ome-common-java/archive/setlength-performance.zip

bf1:
	unzip bioformats-5.7.0.zip && mv bioformats-5.7.0 $(BUILDDIR)/bf1
	ant tools -f $(BUILDDIR)/bf1/build.xml -Dmaven.repo.local=$(BUILDDIR)/.m2/repository

ome-common:
	unzip setlength-performance.zip && mv ome-common-java-setlength-performance $(BUILDDIR)/ome-common
	mvn clean install -f $(BUILDDIR)/ome-common/pom.xml -Dmaven.repo.local=$(BUILDDIR)/.m2/repository

bf2:
	unzip bioformats-5.7.0.zip && mv bioformats-5.7.0 $(BUILDDIR)/bf2
	sed -i '' -e 's/5.3.2/5.3.3-SNAPSHOT/g' $(BUILDDIR)/bf2/pom.xml
	ant tools -f $(BUILDDIR)/bf2/build.xml -Dmaven.repo.local=$(BUILDDIR)/.m2/repository -Dome-common.version=5.3.3-SNAPSHOT
     
.PHONY: clean bf1 ome-common bf2

and running /tmp/build/bf{1,2}/tools/showinf -nopix -cache on a few filesets, I did not see any invalidated cache files.

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 master and cut a patch release ome-common:5.3.3 with this performance improvement. We can then propagate the release down the stack up to Bio-Formats. Would that work for you @melissalinkert @dgault ?

@sbesson sbesson mentioned this pull request Sep 25, 2017
@sbesson sbesson merged commit 43ca478 into ome:master Sep 25, 2017
@melissalinkert melissalinkert mentioned this pull request Dec 11, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 12, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 12, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 12, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 13, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 13, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 13, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 13, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 13, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 14, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 14, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 14, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 15, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 15, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 15, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 18, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 18, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 18, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 19, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 25, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 25, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 25, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 26, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 26, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 26, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 27, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 27, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 27, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 28, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 28, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 28, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 29, 2017
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 29, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Dec 29, 2017
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 1, 2018
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 1, 2018
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 1, 2018
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 2, 2018
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 2, 2018
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 2, 2018
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 3, 2018
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 3, 2018
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 3, 2018
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 4, 2018
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 4, 2018
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/)
snoopycrimecop added a commit to snoopycrimecop/ome-common-java that referenced this pull request Jan 4, 2018
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/)
sbesson added a commit that referenced this pull request Jan 4, 2018
@melissalinkert melissalinkert deleted the setlength-performance branch July 11, 2018 15:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants