1

ソースコードは以下のとおりです

public static ArrayList<Integer> readFile(String fileName) {

String sdPath;
sdPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
ArrayList<Integer> data = new ArrayList<Integer>();

try {

Scanner s = new Scanner(new FileInputStream(new File(sdPath + fileName)));

while( s.hasNext() ) {
data.add( s.nextInt() );
}
}
catch(FileNotFoundException fN) {
fN.printStackTrace();
}
catch(IOException e) {
System.out.println(e);
}

return data;    
}

このコードを実行すると、LogCatはAndroidの表示が変更されたメッセージを以下に表示します

.
.
.
04-27 00:12:31.216: D/dalvikvm(17141): GC_CONCURRENT freed 1953K, 23% free 15699K/20295K, paused 2ms+12ms
.
.
.

さらに、上記のコードは数秒以内に私のデスクトップで完全に操作可能です。

plzは私を助けます。

4

2 に答える 2

2

電話は、デスクトップ コンピューターに比べてリソースが非常に限られています。携帯電話がデスクトップ コンピューターと同じ速度で計算負荷の高いタスクを完了できると期待するべきではありません...

その大きな ArrayList をロードしようとして、電話の RAM をすべて使い果たしています。

いくつかのヒント:

  • readFile コードがバックグラウンド スレッドにない場合は、バックグラウンド スレッドに移動します。
  • 別のデータ構造を検討してください。何らかの種類の SQL がおそらくこの大規模なデータ セットをより効率的に処理するでしょう。
  • 一度に ArrayList の (比較的) 小さい部分のみをロードすることを検討してください。必要なセクションで作業を行い、別のセクションが必要な場合は個別にロードしてください。
  • データを複数の小さなファイルに分割し、現在の操作に必要なファイルのみをロードすることを検討してください。
于 2012-04-26T15:27:51.983 に答える
0

データをディスクに保持し、代わりにメモリ マップド IO を使用します。FileChannel と map 関数を見て、そこから取り出してください。バッファ クラスには、整数を取得するメソッドもあります。

于 2012-12-02T18:21:25.760 に答える