長さ 3 から 6 の単語を含む辞書と、単語 7 を含む辞書の 2 つのファイルがあります。単語は、改行で区切られたテキストファイルに保存されます。このメソッドはファイルをロードし、アプリケーション クラスに保存する arraylist に挿入します。
ファイルサイズは 386KB と 380KB で、それぞれ 200k ワード未満です。
private void loadDataIntoDictionary(String filename) throws Exception {
Log.d(TAG, "loading file: " + filename);
AssetFileDescriptor descriptor = getAssets().openFd(filename);
FileReader fileReader = new FileReader(descriptor.getFileDescriptor());
BufferedReader bufferedReader = new BufferedReader(fileReader);
String word = null;
int i = 0;
MyApp appState = ((MyApp)getApplicationContext());
while ((word = bufferedReader.readLine()) != null) {
appState.addToDictionary(word);
word = null;
i++;
}
Log.d(TAG, "added " + i + " words to the dictionary");
bufferedReader.close();
}
プログラムは、2.3.3 を実行しているエミュレーターで 64MB の SD カードを使用してクラッシュします。logcat を使用して報告されているエラー。ヒープが 24 MB を超えて大きくなります。次に、クランプ ターゲット GC ヒープ25.XXX
が 24.000 MB にあることがわかります。
GC_FOR_MALLOC は 0K を解放し、12% を解放し、外部 1657k/2137K を一時停止し、208ms を一時停止しました。
GC_CONCURRENT が XXK を解放し、14% が解放されまし
た。
このような大きなヒープを取得せずにこれらのファイルをロードするにはどうすればよいですか?
MyApp 内:
private ArrayList<String> dictionary = new ArrayList<String>();
public void addToDictionary(String word) {
dictionary.add(word);
}