Java 内存不足错误
我试图将一个12mb的txt文件作为哈希映射加载到内存中,以使应用程序可以使用它,但我遇到了一个OutOfMemory错误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
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词典吧?您不能在服务体系结构之后在线托管它吗?