设置大小超过500.000时,处理速度显着降低

 loveyao123456 发布于 2023-02-08 19:32

我不习惯使用非常大的数据集,而且我有点难过.

我有以下代码:

private static Set extractWords(BufferedReader br) throws IOException {
    String strLine;
    String tempWord;
    Set words = new HashSet();
    Utils utils = new Utils();
    int articleCounter = 0;
    while(((strLine = br.readLine()) != null)){
        if(utils.lineIsNotCommentOrLineChange(strLine)){
            articleCounter++;
            System.out.println("Working article : " + utils.getArticleName(strLine) + " *** Article #" + articleCounter + " of 3.769.926");
            strLine = utils.removeURLs(strLine);
            strLine = utils.convertUnicode(strLine);
            String[] temp = strLine.split("\\W+");
            for(int i = 0; i < temp.length; i++){
                tempWord = temp[i].trim().toLowerCase();
                if(utils.validateWord(tempWord)){
                    words.add(tempWord);
                    System.out.println("Added word " + tempWord + " to list");
                }
            }
        }
    }
    return words;
}

这基本上从BufferedReader获取一个巨大的文本文件,其中每行文本都是文章中的文本.我想在这个文本文件中列出一个独特的单词列表,但那里有3.769.926篇文章,所以字数非常大.

根据我对集合的理解,或者特别是HashSets,这应该是工作的人.一开始一切都运行得很顺利,但是在500.000篇文章之后,它开始放慢一点.当它达到700.000时,它开始变得足够缓慢,它基本上停止了两分之一,然后又重新开始.这里有一个瓶颈,我看不出它是什么..

有任何想法吗?

1 个回答
  • 我相信您可能遇到的问题是哈希表(集合或映射)必须由它可以容纳的固定数量的条目支持.所以你的第一个声明可能有一个表可以容纳16个条目.抛开负载因素之类的东西,一旦你试图将17个条目放入表中,它必须增长以容纳更多条目以防止冲突,因此Java将为你扩展它.

    此扩展包括创建包含2 * previousSize条目的新表,然后复制旧条目.因此,如果你不断扩展,你最终可能会遇到一个区域,比如524,288,它将不得不增长,但它将创建一个能够处理1,048,576个条目的新表,但它必须复制整个上一个表.

    如果你不介意额外的查找时间,你可能会考虑使用a TreeSet而不是a HashSet.您的查找现在将是对数时间,但是Tree没有预先分配的表,并且可以轻松地动态增长.要么使用它,要么声明你的大小,HashSet这样它就不会动态增长.

    2023-02-08 19:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有