使用 Android 加载 1,440,000 大小的 ArrayList 时操作速度极慢



源代码如下所示

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
.
.
.

此外,上面的代码可以在几秒钟内在我的桌面上完全操作。

请帮助我。

与台式计算机相比,电话的资源非常有限。您不应该期望手机能够以与台式计算机相同的速度完成计算密集型任务......

您正在用完所有手机RAM,试图将ArrayList的那么大加载到其中。

一些提示:

  • 将 readFile 代码移动到后台线程(如果尚未存在)。
  • 考虑一种不同的数据结构,某种SQL可能会更有效地处理如此大的数据集。
  • 考虑一次只加载 ArrayList 的一小部分(相对)部分。 在您需要的部分上工作,当您需要另一个部分时,单独加载它。
  • 请考虑将数据分解为多个较小的文件,并仅加载当前操作所需的文件。

只需将数据保留在磁盘上并改用内存映射 IO。看看FileChannel和map函数,然后从那里开始。缓冲区类还具有检索整数的方法。

最新更新