0

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

@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 或后台服务中?

4

2 回答 2

1

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

于 2013-09-09T18:09:30.860 回答
1

正如 Tone 建议的那样,我修改了代码以包含 BufferedInputStream 并将其传递给 ObjectInputStream:

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

这已将加载时间显着减少到 3 秒多一点。

于 2013-09-10T08:18:17.797 回答