将大文件加载到内存中

时间:2014-01-19 14:01:29

标签: android multithreading performance

我有一个本地存储的文件,大小约为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);
    }

出现两个问题:

  1. 阅读仍然可以放慢速度。
  2. 在主集上调用addAll时出现内存不足错误。
  3. 有更好的方法吗?怎么样?

1 个答案:

答案 0 :(得分:1)

使用500,000行和readLine()进行500,000次读取。

创建一个64k缓冲区并读入。

处理每一行,然后再读64k。

这应该将你的读数减少到500,000

的一小部分