Permalink
Browse files

GATKBAMIndex calls buffer.length() on every read. This is causing mu…

…ch pain.

 Optimized by getting the read of the file upon opening the index-file and using that instead.
  • Loading branch information...
1 parent c5701a9 commit 0e7e6d35d852edc837e75a0c93efd49bda192826 @yfarjoun yfarjoun committed Apr 29, 2013
Showing with 10 additions and 6 deletions.
  1. +10 −6 public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java
View
16 public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java
@@ -25,16 +25,17 @@
package org.broadinstitute.sting.gatk.datasources.reads;
+import net.sf.samtools.Bin;
+import net.sf.samtools.GATKBin;
+import net.sf.samtools.GATKChunk;
+import net.sf.samtools.LinearIndex;
import net.sf.samtools.seekablestream.SeekableBufferedStream;
import net.sf.samtools.seekablestream.SeekableFileStream;
-
-import net.sf.samtools.*;
-
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
-import org.broadinstitute.sting.utils.exceptions.StingException;
import org.broadinstitute.sting.utils.exceptions.UserException;
-import java.io.*;
+import java.io.File;
+import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
@@ -86,6 +87,7 @@
private SeekableFileStream fileStream;
private SeekableBufferedStream bufferedStream;
+ private Long fileLength;
public GATKBAMIndex(final File file) {
mFile = file;
@@ -307,6 +309,7 @@ private void openIndexFile() {
try {
fileStream = new SeekableFileStream(mFile);
bufferedStream = new SeekableBufferedStream(fileStream,BUFFERED_STREAM_BUFFER_SIZE);
+ fileLength=bufferedStream.length();
}
catch (IOException exc) {
throw new ReviewedStingException("Unable to open index file (" + exc.getMessage() +")" + mFile, exc);
@@ -317,6 +320,7 @@ private void closeIndexFile() {
try {
bufferedStream.close();
fileStream.close();
+ fileLength=null;
}
catch (IOException exc) {
throw new ReviewedStingException("Unable to close index file " + mFile, exc);
@@ -368,7 +372,7 @@ private void read(final ByteBuffer buffer) {
// We have a rigid expectation here to read in exactly the number of bytes we've limited
// our buffer to -- if there isn't enough data in the file, the index
// must be truncated or otherwise corrupt:
- if(bytesRequested > bufferedStream.length() - bufferedStream.position()){
+ if(bytesRequested > fileLength - bufferedStream.position()){
throw new UserException.MalformedFile(mFile, String.format("Premature end-of-file while reading BAM index file %s. " +
"It's likely that this file is truncated or corrupt -- " +
"Please try re-indexing the corresponding BAM file.",

0 comments on commit 0e7e6d3

Please sign in to comment.