2011-09-27 134 views
0

我想一个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; 
    } 
+0

请你任一张贴本实施例的完整源代码,或优选更小的,更简单的再生这个问题?要么发布到问题上,要么发布到pastebin上。谢谢! –

+1

将txt文件加载到内存中的代码是什么?首先,12MB是巨大的开始,然后你试图制作一个数据结构。看看是否没有办法缩小文本文件或以增量或其他方式加载它:) – Bob

+1

12mb在服务器上非常庞大,更不用说在移动设备上。我认为这是一个用于句子分析的digram词典?你不能在服务架构之后在线托管它吗? – mcfinnigan

回答

2

在内存中读取一个12MB的文件会减慢设备。对普通电脑而言,12mb听起来可能会少一些,但大多数Android手机的内存不足512MB。

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

此外,使用SQLite Database可能更适合加速整个事情。

2

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

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

分配新数组后,旧数组中的每个元素都被重新定位到新数组中。这有效地为其他项目添加“空槽”来利用。

1

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

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

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

dalvik.vm.heapsize =32米