内存不足错误

时间:2011-09-27 15:03:17

标签: java android

我正在尝试将12mb txt文件作为HashMap加载到内存中,以使应用程序可以使用它,但我得到的是OutOfMemoryError

09-27 15:42:17.560: ERROR/AndroidRuntime(19030):     ... 11 more
09-27 15:42:17.560: ERROR/AndroidRuntime(19030): Caused by: java.lang.OutOfMemoryError
09-27 15:42:17.560: ERROR/AndroidRuntime(19030):     at java.util.HashMap.makeTable(HashMap.java:559)
09-27 15:42:17.560: ERROR/AndroidRuntime(19030):     at java.util.HashMap.doubleCapacity(HashMap.java:579)
09-27 15:42:17.560: ERROR/AndroidRuntime(19030):     at java.util.HashMap.put(HashMap.java:409)
09-27 15:42:17.560: ERROR/AndroidRuntime(19030):     at org.com.SentencesActivity.loadBigramFrequencies(SentencesActivity.java:151)
09-27 15:42:17.560: ERROR/AndroidRuntime(19030):     at org.com.SentencesActivity.onClick(SentencesActivity.java:56)

有没有办法解决它或者是dalvik vm的限制?

将文件加载到内存中的代码:

public HashMap<String, Double> loadBigramFrequencies() throws IOException {
        AssetManager assetManager = getAssets();

        HashMap<String, Double> bigramFrequencies = new HashMap<String, Double>();
        String[] splittedLine;
        try {
            // open the file for reading
            InputStream instream = assetManager.open("bigramFrequencies.txt");

            // if file the available for reading
            if (instream != null) {
                // prepare the file for reading
                InputStreamReader inputreader = new InputStreamReader(instream);
                BufferedReader buffreader = new BufferedReader(inputreader);

                String line;

                // read every line of the file into the line-variable, on line
                // at the time
                while ((line = buffreader.readLine()) != null) {
                    // do something with the settings from the file
                    splittedLine = line.split("\\#");
                    bigramFrequencies.put(splittedLine[0].trim(),
                            Double.parseDouble(splittedLine[1].trim()));
                }
                Log.v(LOG_TAG, "bigram frequencies loaded");

            }

            // close the file again
            instream.close();

        } catch (java.io.FileNotFoundException e) {
            // do something if the myfilename.txt does not exits
        }

        return bigramFrequencies;
    }

3 个答案:

答案 0 :(得分:2)

在内存中读取12mb文件会降低设备速度。对于普通电脑来说,12mb可能听起来更少,但大多数Android手机的RAM都不到512MB。

您应该能够重新格式化文件或将其拆分,以便应用程序可以在需要时读取必要的部分。

另外,使用SQLite Database可能更适合加速整个过程。

答案 1 :(得分:2)

应用程序中的HashMap添加了一个项目,并且这样做达到了当前阵列支持的限制。因此,它试图调整大小,并且这样做会耗尽内存。

HashMaps使用哈希跳转到数组中的特定元素,然后在后备存储中查找该项。整个算法在很大程度上取决于数组是否足够稀疏以避免散列空间的过度冲突(散列除以模数大小的模数)。如果你向一个面向哈希的结构添加很多东西,它需要分配一个更大的数组来维护足够的空数组元素,以使性能不会恶化。

在分配新数组之后,旧数组中的每个元素都会重新定位到新数组中。这有效地为其他项目增加了“空位”。

答案 2 :(得分:1)

如果设备有足够的内存,那么

尝试增加app可用的堆大小。

编辑build.prop文件并增加堆大小

dalvik.vm.heapsize =32米