我有一个本地存储的文件,大小约为2.3MB,总共约有500 000行,我想将它存储到内存中HashSet
。由于文件较大,读取速度很慢,我将文件拆分为5个较小的文件,每个文件少于10万行。
我的想法是从Application类中实例化5个独立的线程。每个线程都会读取自己的文件并将数据存储在自己的集合中。完成后,它将获得的子集返回到主线程,即。到Application类,然后存储在主集中。
线程代码如下:
private class LoadFileThread extends Thread {
private String filename;
private Set<String> subSet;
private MyApplication application;
public LoadFileThread(String filename, MyApplication ctx) {
this.filename = filename;
this.application = ctx;
this.subSet = new HashSet<String>();
}
@Override
public void run() {
AssetManager am = application.getAssets();
BufferedReader reader = null;
try {
InputStream is = am.open(filename);
reader = new BufferedReader(new InputStreamReader(
is));
String line = null;
while ((line = reader.readLine()) != null) {
subSet.add(line.toUpperCase());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {reader.close();}catch (IOException ignorable) {}
}
application.setSubSet(subSet, this.getName());
}
}
Application类中的方法setSubSet:
public synchronized void setSubSet(Set<String> subSet, String name) {
myMainSet.addAll(subSet);
Log.d("Thread finished", name);
}
出现两个问题:
addAll
时出现内存不足错误。有更好的方法吗?怎么样?
答案 0 :(得分:1)
使用500,000行和readLine()进行500,000次读取。
创建一个64k缓冲区并读入。
处理每一行,然后再读64k。
这应该将你的读数减少到500,000
的一小部分