为什么我的hashset如此耗费内存?

faz*_*faz 3 java hashset

我发现我的程序正在增加的内存是因为下面的代码,目前我正在读一个大约7GB的文件,我相信将存储在hashset中的那个比10M的课程,但我的程序的内存持续增加到300MB,然后由于OutofMemoryError而崩溃.如果是Hashset问题,我应该选择哪种数据结构?

    if(tagsStr!=null) {
        if(tagsStr.contains("a")||tagsStr.contains("b")||tagsStr.contains("c")) {
            maTable.add(postId);
        }
    } else {
        if(maTable.contains(parentId)) {
            //do sth else, no memories added here
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

你还没告诉我们你在做什么,但是:

  • 如果您的文件当前类似于ASCII,则您读取的每个字符将是文件中的一个字节或内存中的两个字节.
  • 每个字符串都有一个对象开销 - 如果你要存储大量的小字符串,这可能很重要
  • 如果您正在阅读行BufferedReader(或从大字符串中获取子字符串),每个行都可能有一个大的后备缓冲区 - 您可能希望使用它maTable.add(new String(postId))来避免这种情况
  • 散列集中的每个条目都需要一个单独的对象来保存key/hashcode/value/next-entry值.同样,有很多条目,这可以加起来

简而言之,你很可能没有做错任何事情,但是记忆增加因素的组合对你不利.其中大部分是不可避免的,但第三个可能是相关的.