我有一个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;
将数据加载到arraylist需要相当长的时间(平均时间为13.5秒)。 GC_CONCURRENT在执行期间反复释放内存。
有没有办法提高此操作的速度,还是仅仅是它处理的数据量?如果是这样,是否建议将其推入aSyncTask或后台服务?
答案 0 :(得分:1)
缓冲inputReader。应节省75%ish。
答案 1 :(得分:1)
正如Tone建议的那样,我修改了代码以包含BufferedInputStream并将其传递给ObjectInputStream:
BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream ois = new ObjectInputStream(bis);
这大大减少了加载时间到3秒多一点。