-->

安卓:文件读取 - 内存不足问题(Android: File Reading - OutOfMemo

2019-10-17 16:35发布

我创建涉及从文件中读取数据的应用程序。 该文件比较大(1.8 MB),并正从的onCreate异步线程读取。 应用程序启动后的第一次,它加载就好了。 但是,如果您单击后退按钮,然后再加载它,它运行的内存和崩溃(抛出内存溢出错误)。

我如何得到它使用的最低内存量可能和/或免费的内存,当它完成?

文件读出代码(在执行doInBackground()异步类的方法):

public ArrayList<String> createDataList() {
    dataList = new ArrayList<String>();
    BufferedReader br = null;
    try {
        br = new BufferedReader(new InputStreamReader(getAssets().open(
                    "text.txt")));
        String data;
        while ((data = br.readLine()) != null) {
            dataList.add(data);
        }                           
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            br.close(); // stop reading
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    return dataList;
}

编辑*异步类:

private class loadData extends AsyncTask<Void, Void, ArrayList<String>> {

    @Override
    protected ArrayList<String> doInBackground(Void... arg0) {
        dataList = createDataList();
        return dataList;
    }

    protected void onPostExecute(ArrayList<String> result) {
        super.onPostExecute(result);
        // display first element in ArrayList in TextView as a test

    }

}

我试图分裂基础上我要如何组织数据并从每个文本文件中的数据存储到一个独立的文件ArrayList ,但我不得不与记忆问题为好。 我还存储所有的数据到一个“主” ArrayList然后调用在该“主”的方法,将数据添加到适当ArrayList (删除/从“主”清除数据,只要它复制)。

如何简化和降低内存的影响任何想法?

编辑**

logcat的:

这是当您单击后退按钮,然后再加载活动。 下面只是所产生的消息中的一个(在详细):

Answer 1:

首先,确保你没有数据的两个副本在内存中。 你可以开始创建新的一个前空出参考旧的ArrayList,但你要仔细做到这一点-调用ArrayList.clear()首先将是更彻底。

其次,弄清楚,ArrayList的是通过使用类似的工具吃了多少内存hprof或Eclipse的MAT。 如果它使用一吨的空间,你可能要考虑一个更紧凑的数据表示。

所以......从代码片段,它看起来像你只是读了一堆文本字符串从文件中,用字节到焦炭转化。 如果源材料是纯UTF-8(即基本上ASCII),你有一个2x膨胀为UTF-16,加上分配焦炭[]对象的以将其保持,加上包装了字符串对象的尺寸,加上在ArrayList中的条目的开销。 根据文件中的平均串有多长,这可能是你的一个1.8MB多显著。

为了避免这种情况的一个方法是将文件读入到内存中byte[]扫描,以找出每个字符串开始的地方,只是保持一个整数数组与开始每个字符串的偏移量。 当你需要串N,它从解码byte[]String ,并将其返回。 这显著减少你的开销。 您可以通过不加载文件,只是读出需要(使用单独的琴弦进一步降低它RandomAccessFile ),但是这可能会慢下来。



Answer 2:

你可以尝试添加android:largeHeap="true"在你的清单,但它不是在Android的API-8支持。 据我了解,你正在阅读和数据存储到堆内存,这通常是非常有限的,它的大小取决于你运行你的应用程序在设备上。

您可能还需要在这里调查: Android的-内存不足



Answer 3:

好像是你可能有一点麻烦与弦乐的不变性 。

你为什么不试着改变你的代码,以便您使用StringBuilder例如? 当然,你要改变一个以上的事情,但它会在你的代码非常相似,不会那么快填你的记忆了。



文章来源: Android: File Reading - OutOfMemory Issue