- Notifications
You must be signed in to change notification settings - Fork8
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 inc94a809
| @Override | |
| publicvoidonCreate() | |
| { | |
| 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 inc23d584
@SuppressWarnings("SameParameterValue") privatevoidloadSequenceCharactersDataIntoMap( finalStringsequenceCharactersFileName, finalMap<String,String>charactersFromStrokeDigitSequence ) { finallongstartMilliseconds =System.currentTimeMillis(); try { finalInputStreaminputStream =getAssets().open(sequenceCharactersFileName); finalBufferedReaderbufferedReader =newBufferedReader(newInputStreamReader(inputStream)); Stringline; while ((line =bufferedReader.readLine()) !=null) { if (!isCommentLine(line)) { finalString[]sunderedLineArray =Stringy.sunder(line,"\t"); finalStringstrokeDigitSequence =sunderedLineArray[0]; finalStringcharacters =sunderedLineArray[1]; charactersFromStrokeDigitSequence.put(strokeDigitSequence,characters); } } } catch (IOExceptionexception) { exception.printStackTrace(); } finallongendMilliseconds =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?