【问题标题】:How to avoid out of memory when constructing a map of more than 100 thousand keys构建超过10万个key的map时如何避免内存不足
【发布时间】:2019-05-21 12:17:20
【问题描述】:

我正在使用 java 中的代码处理数据库表,并使用一个字符串值(项目名称,最长可达 1024 个字符)和一个键从该表构造唯一项目列表编号(长)。该表可以包含 100K 或更多的唯一项。代码是这样的:

Map<String, long> getUniqueItems() {  
   Map<Stirng, long> map = new HashMap<>();  
   recordsItr = readDatabaseRecord();  
   while(recordItr.hasNext()) {  
       RecordItem item = recordItr.next();  
       map.put(item.getName(), item.getValue();  
   }  

   return map; 
}

但是,如果唯一记录的数量很大,那么我当然会在应用程序中耗尽内存。在构建它时如何避免外出或记忆。最后,一旦我得到地图,我就会用它来遍历它的条目并对每个项目做一些事情。

谢谢,

阿尔萨兰

【问题讨论】:

  • 一般来说,不要把整件事都吞进记忆里;遍历数据库ResultSet(或等效)。
  • 一般来说:100k 个条目应该不是什么大问题,除非条目在某些方面是巨大。此处可能需要更多信息。
  • 你可以在ResultSet上使用setFetchSize()方法:stackoverflow.com/questions/858836/…
  • 您运行的是 64 位还是 32 位虚拟机?

标签: java dictionary out-of-memory


【解决方案1】:

正如@Marco13 的评论,100k 个元素对于存储在主内存中并不算太大。但是,如果recordsItr 是一个数组,编译器将需要连续 块内存来存储元素,在这种情况下,如果您的主内存拥挤,您可能会出现内存不足的问题。除了使用数组,你可以使用另一个不需要连续内存的数据结构,有stackqueuelinked list,...我认为它们对于100k来说已经足够了元素(如果更多,我不确定)。此外,不要忘记优化代码以减少使用过多内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多