首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在应用程序启动时在Android中加载(反序列化) _quickly_ 2MB数据

在应用程序启动时在Android中加载(反序列化) _quickly_ 2MB数据
EN

Stack Overflow用户
提问于 2012-12-27 18:43:07
回答 4查看 376关注 0票数 0

在我的Android应用程序启动时,我需要快速加载大约2MB的数据。我真的需要内存中的所有这些数据,所以像SQLite之类的东西不能替代。

该数据由大约3000个int[][]阵列组成。数组维数平均在7左右。

我首先在我的桌面上实现了一些原型,并将其移植到android上。在桌面上,我只使用Java的(反)序列化。该数据的反序列化在我的桌面计算机上大约需要90 my。

但是,在Android2.2.1上,相同的进程大约需要15秒(!)我的HTC魔术。这是如此缓慢,如果我不去反序列化在一个单独的线程,我的应用程序将被杀死。总之,这是令人无法接受的缓慢。

我做错了什么?我该不该

  • 切换到类似协议缓冲器之类的东西?这真的会加快几个级别的反序列化过程吗?毕竟,我正在反序列化的不是复杂的对象,只是int[][]数组吗?!
  • 设计我自己的自定义二进制文件格式?我以前从来没有这样做过,也不知道从哪里开始
  • 做点别的吗?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-27 19:11:08

为什么不绕过内置反序列化,使用直接二进制I/O?当速度是你最关心的,而不一定是容易编程的时候,你无法超越它。

对于输出,伪代码如下所示:

代码语言:javascript
复制
write number of arrays
for each array
  write n,m array sizes
  for each element of array
    write array element

对于输入,伪代码是:

代码语言:javascript
复制
read number of arrays
for each array
  read n,m array sizes
  allocate the array
  for each element of array
    read array element

当您用二进制读取/写入数字时,可以绕过二进制和字符之间的所有转换。速度应仅受文件存储介质的数据传输速率的限制。

票数 4
EN

Stack Overflow用户

发布于 2013-02-03 17:56:56

正如迈克·邓拉维所建议的,在尝试了几件事情之后,直接二进制I/O似乎是最快的。我几乎一字不差地使用了他的素描版本。但是,为了完整,如果其他人想尝试,我将在这里发布我的完整代码;尽管它非常基本,并且没有任何类型的正常检查。这是为了读取这样的二进制流;写入是绝对类似的。

代码语言:javascript
复制
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;  
}
票数 1
EN

Stack Overflow用户

发布于 2012-12-27 18:45:46

几个月前,我在一个项目上遇到了同样的问题。我认为您应该将您的文件分割成不同的部分,并且只在用户选择之后加载相关的部分。希望这会有帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14059594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档