Fix binary reading code performance.
This is not the Right fix ; the Right fix would be to read the file in a buffered way. However this delivers tolerable performance for a minimal amount of code changes. We may want to skip submitting this patch, but keep it around in case we need to use the functionality until we have a good patch. Change-Id: I1ba938f82acfd9436c3701d1078ff981afdbea60main
parent
5ee0ee0dbe
commit
1d80a7f395
|
@ -1122,6 +1122,12 @@ public class BinaryDictInputOutput {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The word cache here is a stopgap bandaid to help the catastrophic performance
|
||||||
|
// of this method. Since it performs direct, unbuffered random access to the file and
|
||||||
|
// may be called hundreds of thousands of times, the resulting performance is not
|
||||||
|
// reasonable without some kind of cache. Thus:
|
||||||
|
// TODO: perform buffered I/O here and in other places in the code.
|
||||||
|
private static TreeMap<Integer, String> wordCache = new TreeMap<Integer, String>();
|
||||||
/**
|
/**
|
||||||
* Finds, as a string, the word at the address passed as an argument.
|
* Finds, as a string, the word at the address passed as an argument.
|
||||||
*
|
*
|
||||||
|
@ -1131,8 +1137,10 @@ public class BinaryDictInputOutput {
|
||||||
* @return the word, as a string.
|
* @return the word, as a string.
|
||||||
* @throws IOException if the file can't be read.
|
* @throws IOException if the file can't be read.
|
||||||
*/
|
*/
|
||||||
private static String getWordAtAddress(RandomAccessFile source, long headerSize,
|
private static String getWordAtAddress(final RandomAccessFile source, final long headerSize,
|
||||||
int address) throws IOException {
|
int address) throws IOException {
|
||||||
|
final String cachedString = wordCache.get(address);
|
||||||
|
if (null != cachedString) return cachedString;
|
||||||
final long originalPointer = source.getFilePointer();
|
final long originalPointer = source.getFilePointer();
|
||||||
source.seek(headerSize);
|
source.seek(headerSize);
|
||||||
final int count = readCharGroupCount(source);
|
final int count = readCharGroupCount(source);
|
||||||
|
@ -1171,6 +1179,7 @@ public class BinaryDictInputOutput {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
source.seek(originalPointer);
|
source.seek(originalPointer);
|
||||||
|
wordCache.put(address, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue