Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内存不足错误_Java_Android - Fatal编程技术网

Java 内存不足错误

Java 内存不足错误,java,android,Java,Android,我试图将一个12mb的txt文件作为哈希映射加载到内存中,以使应用程序可以使用它,但我遇到了一个OutOfMemory错误 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/AndroidRun

我试图将一个12mb的txt文件作为哈希映射加载到内存中,以使应用程序可以使用它,但我遇到了一个OutOfMemory错误

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;
    }
public HashMap loadBigramFrequencies()引发IOException{
AssetManager AssetManager=getAssets();
HashMap bigramFrequencies=新HashMap();
字符串[]分隔线;
试一试{
//打开文件进行读取
InputStream instream=assetManager.open(“bigramFrequencies.txt”);
//如果文件可供读取,则
如果(流内!=null){
//准备文件以便阅读
InputStreamReader inputreader=新的InputStreamReader(流内);
BufferedReader buffreader=新的BufferedReader(inputreader);
弦线;
//在线将文件的每一行读入line变量
//当时
而((line=buffreader.readLine())!=null){
//对文件中的设置执行一些操作
splittedLine=line.split(“\\\\”);
bigramFrequencies.put(分割线[0].trim(),
Double.parseDouble(splittedLine[1].trim());
}
Log.v(Log_标签,“加载的双随机码频率”);
}
//再次关闭该文件
流内关闭();
}catch(java.io.filenotfound异常){
//如果myfilename.txt不存在,请执行某些操作
}
返回频率;
}

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

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


此外,使用a可能更适合于加速整个过程。

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

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


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

应用程序中的a
HashMap
添加了一个项,这样做就达到了当前数组备份的限制。因此,它试图调整大小,但这样做会耗尽内存

HashMaps使用哈希跳转到数组中的特定元素,然后在备份存储中查找该项。整个算法在很大程度上依赖于数组是否足够稀疏,以避免哈希空间的过度冲突(哈希除以数组大小的模)。如果向面向散列的结构中添加了大量内容,则需要分配一个更大的数组,以保持足够的空数组元素,从而使性能不会严重降低


分配新数组后,旧数组中的每个元素都会重新定位到新数组中。这有效地为其他项添加了“空槽”以供使用。

应用程序中的HashMap添加了一个项,这样做就达到了当前数组备份的限制。因此,它试图调整大小,但这样做会耗尽内存

HashMaps使用哈希跳转到数组中的特定元素,然后在备份存储中查找该项。整个算法在很大程度上依赖于数组是否足够稀疏,以避免哈希空间的过度冲突(哈希除以数组大小的模)。如果向面向散列的结构中添加了大量内容,则需要分配一个更大的数组,以保持足够的空数组元素,从而使性能不会严重降低


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

如果设备有足够的内存,则

尝试增加应用程序可用的堆大小

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


dalvik.vm.heapsize=32m

如果设备有足够的内存,则

尝试增加应用程序可用的堆大小

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


dalvik.vm.heapsize=32m

您是否可以发布此示例的完整源代码,或者最好是对该问题进行更小、更简单的复制?要么贴到问题上,要么,如果非常冗长,贴到粘贴箱上。谢谢将txt文件加载到内存中的代码是什么?首先,12MB是一个巨大的开始,然后你正试图使它的数据结构。看看是否有办法缩小文本文件或以增量方式加载它:)12mb在服务器上是巨大的,更不用说在移动设备上了。我想这是一本用于句子分析的digram词典吧?你能不能在一个服务架构后面在线托管它?你能不能发布这个例子的完整源代码,或者最好是这个问题的一个更小、更简单的复制品?要么贴到问题上,要么,如果非常冗长,贴到粘贴箱上。谢谢将txt文件加载到内存中的代码是什么?首先,12MB是一个巨大的开始,然后你正试图使它的数据结构。看看是否有办法缩小文本文件或以增量方式加载它:)12mb在服务器上是巨大的,更不用说在移动设备上了。我想这是一本用于句子分析的digram词典吧?您不能在服务体系结构之后在线托管它吗?