-
Notifications
You must be signed in to change notification settings - Fork 7
Description
I don't know very much about programming, so I have produced a rather crappy implementation of the stroke input method.
In particular, I load all the stroke data into memory when the input method service is instantiated:
stroke-input-android/app/src/main/java/io/github/yawnoc/strokeinput/StrokeInputService.java
Lines 153 to 167 in c94a809
@Override | |
public void onCreate() | |
{ | |
super.onCreate(); | |
loadSequenceCharactersDataIntoMap(SEQUENCE_CHARACTERS_FILE_NAME, charactersFromStrokeDigitSequence); | |
loadCharactersIntoCodePointSet(CHARACTERS_FILE_NAME_TRADITIONAL, codePointSetTraditional); | |
loadCharactersIntoCodePointSet(CHARACTERS_FILE_NAME_SIMPLIFIED, codePointSetSimplified); | |
loadRankingData(RANKING_FILE_NAME_TRADITIONAL, sortingRankFromCodePointTraditional, commonCodePointSetTraditional); | |
loadRankingData(RANKING_FILE_NAME_SIMPLIFIED, sortingRankFromCodePointSimplified, commonCodePointSetSimplified); | |
loadPhrasesIntoSet(PHRASES_FILE_NAME_TRADITIONAL, phraseSetTraditional); | |
loadPhrasesIntoSet(PHRASES_FILE_NAME_SIMPLIFIED, phraseSetSimplified); | |
updateCandidateOrderPreference(); | |
} |
It works, but the downsides are:
- It takes a long time to load on lower-end devices (e.g. takes 1.2 seconds on my cheap phone with ~1.3 GB RAM)
- It requires a lot of memory
-
Most of the time is spent during
loadSequenceCharactersDataIntoMap
. Is there a better way of reading a TSV than what I currently have?
stroke-input-android/app/src/main/java/io/github/yawnoc/strokeinput/StrokeInputService.java
Lines 220 to 252 in c23d584
@SuppressWarnings("SameParameterValue") private void loadSequenceCharactersDataIntoMap( final String sequenceCharactersFileName, final Map<String, String> charactersFromStrokeDigitSequence ) { final long startMilliseconds = System.currentTimeMillis(); try { final InputStream inputStream = getAssets().open(sequenceCharactersFileName); final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = bufferedReader.readLine()) != null) { if (!isCommentLine(line)) { final String[] sunderedLineArray = Stringy.sunder(line, "\t"); final String strokeDigitSequence = sunderedLineArray[0]; final String characters = sunderedLineArray[1]; charactersFromStrokeDigitSequence.put(strokeDigitSequence, characters); } } } catch (IOException exception) { exception.printStackTrace(); } final long endMilliseconds = System.currentTimeMillis(); sendLoadingTimeLog(sequenceCharactersFileName, startMilliseconds, endMilliseconds); } -
Alternatively, given that the stroke data is a constant map, is it possible to bake it into the class so that I don't need to load it every time? Or, can we do something completely different that isn't so memory intensive?