【问题标题】:Speed Issue Deserializing Arraylist Android速度问题反序列化 Arraylist Android
【发布时间】:2013-09-07 22:42:29
【问题描述】:

我有一个 ArrayList allFeeds 和一个读取序列化数据的方法。

@SuppressWarnings("unchecked")
public void loadFile() {

    final String FILENAME = "feeds.ser";
    File file = fileContext.getApplicationContext().getFileStreamPath(FILENAME);

    try {           
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        allFeeds = (ArrayList<Feed>) ois.readObject();
    }
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
} 

序列化数据存储在一个 0.49mb 大小的文件中,由 33 个 Feed 对象组成。 Feed 对象的结构如下,其中 HashMap 最多可保存 900 个密钥对值:

int id;
String name;
int datatype; 
String tag;
Long time;
Double value;
String dpInterval;  
HashMap<Long, Double> historicFeedData;

将数据加载回数组列表需要相当长的时间(平均时间为 13.5 秒)。 GC_CONCURRENT 在执行期间反复释放内存。

有没有办法提高此操作的速度,或者仅仅是它正在处理的数据量?如果是这样,是否建议将其推送到 aSyncTask 或后台服务中?

【问题讨论】:

  • 缺少基本信息,例如多长时间、多少字节、对象结构。
  • 同意 - 我昨晚很晚才写了这篇文章,经过反思,它缺乏信息。已添加它以使其更全面。谢谢!

标签: java android performance arraylist


【解决方案1】:

缓冲 inputReader。应该节省 75% 左右。

【讨论】:

  • 欢迎来到 Stack Overflow!您能否将您的答案扩展到一个简单的建议,以便它对未来的读者(和提问者)真正有用?显示如何 缓冲读者的代码示例应该会有所帮助。另外,不要害怕用更多的词来更清楚地描述。
【解决方案2】:

按照 Tone 的建议,我修改了代码以包含一个 BufferedInputStream 并将其传递给 ObjectInputStream:

BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream ois = new ObjectInputStream(bis);

这已将加载时间大幅缩短至 3 秒多一点。

【讨论】:

    猜你喜欢
    • 2013-04-02
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2012-05-24
    • 2013-12-25
    相关资源
    最近更新 更多