在我的Android应用程序启动时,我需要快速加载大约2MB的数据。我真的需要内存中的所有这些数据,所以像SQLite之类的东西不能替代。
该数据由大约3000个int[][]阵列组成。数组维数平均在7左右。
我首先在我的桌面上实现了一些原型,并将其移植到android上。在桌面上,我只使用Java的(反)序列化。该数据的反序列化在我的桌面计算机上大约需要90 my。
但是,在Android2.2.1上,相同的进程大约需要15秒(!)我的HTC魔术。这是如此缓慢,如果我不去反序列化在一个单独的线程,我的应用程序将被杀死。总之,这是令人无法接受的缓慢。
我做错了什么?我该不该
int[][]数组吗?!发布于 2012-12-27 19:11:08
为什么不绕过内置反序列化,使用直接二进制I/O?当速度是你最关心的,而不一定是容易编程的时候,你无法超越它。
对于输出,伪代码如下所示:
write number of arrays
for each array
write n,m array sizes
for each element of array
write array element对于输入,伪代码是:
read number of arrays
for each array
read n,m array sizes
allocate the array
for each element of array
read array element当您用二进制读取/写入数字时,可以绕过二进制和字符之间的所有转换。速度应仅受文件存储介质的数据传输速率的限制。
发布于 2013-02-03 17:56:56
正如迈克·邓拉维所建议的,在尝试了几件事情之后,直接二进制I/O似乎是最快的。我几乎一字不差地使用了他的素描版本。但是,为了完整,如果其他人想尝试,我将在这里发布我的完整代码;尽管它非常基本,并且没有任何类型的正常检查。这是为了读取这样的二进制流;写入是绝对类似的。
import java.io.*;
public static int[][][] readBinaryInt(String filename) throws IOException {
DataInputStream in = new DataInputStream(
new BufferedInputStream(new FileInputStream(filename)));
int dimOfData = in.readInt();
int[][][] patternijk = new int[dimofData][][];
for(int i=0;i<dimofData;i++) {
int dimStrokes = in.readInt();
int[][] patternjk = new int[dimStrokes][];
for(int j=0;j<dimStrokes;j++) {
int dimPoints = in.readInt();
int[] patternk = new int[dimPoints];
for(int k=0;k<dimPoints;k++) {
patternk[k] = in.readInt();
}
patternjk[j] = patternk;
}
patternijk[i] = patternjk;
}
in.close();
return patternijk;
}发布于 2012-12-27 18:45:46
几个月前,我在一个项目上遇到了同样的问题。我认为您应该将您的文件分割成不同的部分,并且只在用户选择之后加载相关的部分。希望这会有帮助!
https://stackoverflow.com/questions/14059594
复制相似问题