Merge "Low memory mode in UserHistory"

main
Satoshi Kataoka 2013-09-24 11:37:39 +00:00 committed by Android (Google) Code Review
commit f068c6e656
1 changed files with 24 additions and 7 deletions

View File

@ -19,6 +19,7 @@ package com.android.inputmethod.latin.personalization;
import android.content.Context; import android.content.Context;
import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.compat.ActivityManagerCompatUtils;
import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.keyboard.ProximityInfo;
import com.android.inputmethod.latin.AbstractDictionaryWriter; import com.android.inputmethod.latin.AbstractDictionaryWriter;
import com.android.inputmethod.latin.ExpandableDictionary; import com.android.inputmethod.latin.ExpandableDictionary;
@ -41,7 +42,8 @@ import java.util.ArrayList;
public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWriter { public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWriter {
private static final String TAG = DynamicPersonalizationDictionaryWriter.class.getSimpleName(); private static final String TAG = DynamicPersonalizationDictionaryWriter.class.getSimpleName();
/** Maximum number of pairs. Pruning will start when databases goes above this number. */ /** Maximum number of pairs. Pruning will start when databases goes above this number. */
public static final int MAX_HISTORY_BIGRAMS = 10000; public static final int DEFAULT_MAX_HISTORY_BIGRAMS = 10000;
public static final int LOW_MEMORY_MAX_HISTORY_BIGRAMS = 2000;
/** Any pair being typed or picked */ /** Any pair being typed or picked */
private static final int FREQUENCY_FOR_TYPED = 2; private static final int FREQUENCY_FOR_TYPED = 2;
@ -53,10 +55,14 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
private final UserHistoryDictionaryBigramList mBigramList = private final UserHistoryDictionaryBigramList mBigramList =
new UserHistoryDictionaryBigramList(); new UserHistoryDictionaryBigramList();
private final ExpandableDictionary mExpandableDictionary; private final ExpandableDictionary mExpandableDictionary;
private final int mMaxHistoryBigrams;
public DynamicPersonalizationDictionaryWriter(final Context context, final String dictType) { public DynamicPersonalizationDictionaryWriter(final Context context, final String dictType) {
super(context, dictType); super(context, dictType);
mExpandableDictionary = new ExpandableDictionary(dictType); mExpandableDictionary = new ExpandableDictionary(dictType);
final boolean isLowRamDevice = ActivityManagerCompatUtils.isLowRamDevice(context);
mMaxHistoryBigrams = isLowRamDevice ?
LOW_MEMORY_MAX_HISTORY_BIGRAMS : DEFAULT_MAX_HISTORY_BIGRAMS;
} }
@Override @Override
@ -72,6 +78,10 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
@Override @Override
public void addUnigramWord(final String word, final String shortcutTarget, final int frequency, public void addUnigramWord(final String word, final String shortcutTarget, final int frequency,
final boolean isNotAWord) { final boolean isNotAWord) {
if (mBigramList.size() > mMaxHistoryBigrams * 2) {
// Too many entries: just stop adding new vocabrary and wait next refresh.
return;
}
mExpandableDictionary.addWord(word, shortcutTarget, frequency); mExpandableDictionary.addWord(word, shortcutTarget, frequency);
mBigramList.addBigram(null, word, (byte)frequency); mBigramList.addBigram(null, word, (byte)frequency);
} }
@ -79,6 +89,10 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
@Override @Override
public void addBigramWords(final String word0, final String word1, final int frequency, public void addBigramWords(final String word0, final String word1, final int frequency,
final boolean isValid, final long lastModifiedTime) { final boolean isValid, final long lastModifiedTime) {
if (mBigramList.size() > mMaxHistoryBigrams * 2) {
// Too many entries: just stop adding new vocabrary and wait next refresh.
return;
}
if (lastModifiedTime > 0) { if (lastModifiedTime > 0) {
mExpandableDictionary.setBigramAndGetFrequency(word0, word1, mExpandableDictionary.setBigramAndGetFrequency(word0, word1,
new ForgettingCurveParams(frequency, System.currentTimeMillis(), new ForgettingCurveParams(frequency, System.currentTimeMillis(),
@ -102,19 +116,22 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
protected void writeDictionary(final DictEncoder dictEncoder) protected void writeDictionary(final DictEncoder dictEncoder)
throws IOException, UnsupportedFormatException { throws IOException, UnsupportedFormatException {
UserHistoryDictIOUtils.writeDictionary(dictEncoder, UserHistoryDictIOUtils.writeDictionary(dictEncoder,
new FrequencyProvider(mBigramList, mExpandableDictionary), mBigramList, new FrequencyProvider(mBigramList, mExpandableDictionary, mMaxHistoryBigrams),
FORMAT_OPTIONS); mBigramList, FORMAT_OPTIONS);
} }
private static class FrequencyProvider implements BigramDictionaryInterface { private static class FrequencyProvider implements BigramDictionaryInterface {
final private UserHistoryDictionaryBigramList mBigramList; private final UserHistoryDictionaryBigramList mBigramList;
final private ExpandableDictionary mExpandableDictionary; private final ExpandableDictionary mExpandableDictionary;
private final int mMaxHistoryBigrams;
public FrequencyProvider(final UserHistoryDictionaryBigramList bigramList, public FrequencyProvider(final UserHistoryDictionaryBigramList bigramList,
final ExpandableDictionary expandableDictionary) { final ExpandableDictionary expandableDictionary, final int maxHistoryBigrams) {
mBigramList = bigramList; mBigramList = bigramList;
mExpandableDictionary = expandableDictionary; mExpandableDictionary = expandableDictionary;
mMaxHistoryBigrams = maxHistoryBigrams;
} }
@Override @Override
public int getFrequency(final String word0, final String word1) { public int getFrequency(final String word0, final String word1) {
final int freq; final int freq;
@ -130,7 +147,7 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
if (prevFc > 0 && prevFc == fc) { if (prevFc > 0 && prevFc == fc) {
freq = fc & 0xFF; freq = fc & 0xFF;
} else if (UserHistoryForgettingCurveUtils. } else if (UserHistoryForgettingCurveUtils.
needsToSave(fc, isValid, mBigramList.size() <= MAX_HISTORY_BIGRAMS)) { needsToSave(fc, isValid, mBigramList.size() <= mMaxHistoryBigrams)) {
freq = fc & 0xFF; freq = fc & 0xFF;
} else { } else {
// Delete this entry // Delete this entry