【问题标题】:Storing a big text file into vectors and looping over it将大文本文件存储到向量中并在其上循环
【发布时间】:2017-06-13 09:49:00
【问题描述】:

我正在做一个大学项目,在继续之前我有一个问题。我必须将 'dictionary.txt' 导入程序,以便它可以更正其他文件的文本。

现在我的 .txt 文件是 20mb,里面有 200 万字。程序启动后,我将其存储到向量中。加载所有单词需要 2 秒。

我的问题:这是在程序中导入这么多单词的正确方法吗?其背后的逻辑是,“essay”中的每个单词都会在 200 万个单词中循环,直到找到并中断。

在我让这成为可能之前,我想知道这样做是好是坏,以及为什么。

【问题讨论】:

  • 不,vector 是一个非常糟糕的选择。您正在寻找std::map。
  • 我想知道map 将如何帮助!
  • @CinCout 和 map 不会有可能更快的线性搜索。请解释为什么map 没有帮助。
  • 也许内存映射文件,也许这会有所帮助github.com/johannesthoma/mmap_allocator/blob/master/README.md
  • @MichaelWalz 然后std::set 可能会更好

标签: c++ file vector


【解决方案1】:

如果您只想存储单词本身,std::vector 是一个不错的选择,但您应该注意发生的重新分配。

如果字典要保持相同大小,则应考虑为向量保留内存。

基本上你想做这样的事情:

void from_file(std::vector<std::string>& content, std::string pathAndFilename = "")
        {
            content.reserve(1000000) //the size your dictionary has in words

            std::fstream readContent;

            if (pathAndFilename.empty())
            {
                readContent.open("file.txt", std::ios_base::in);
            }
            else
            {
                readContent.open(pathAndFilename.c_str(), std::ios_base::in);
            }

            std::string currentLine;
            while (std::getline(readContent, currentLine))
            {
                content.push_back(currentLine);
            }

            readContent.flush();
            readContent.clear();
            readContent.close();
        }

向量的问题是,搜索需要很长时间。如果您可以确保您的 dictionary.txt 中的每个单词都是唯一的,那么使用集合是可行的方法,因为集合是一个树容器,并且在那里搜索会快很多。

如果您订购矢量,您可以提高矢量搜索的性能,但您不会达到接近地图/集性能的任何东西。不过,您必须准备字典以便与集合一起使用。

此外,您可以将字典拆分为更小的子向量(一个用于 Aa,一个用于 Bb 等)。这将进一步提高您的表现,因为您可以从要纠正的单词的首字母开始。

映射不适合这种情况,因为映射旨在存储键和值。密钥也必须是唯一的。好的,你可以使用你的单词作为键,只使用一个 int id 作为值,但是你也可以使用一个集合。

总体而言,矢量是不错的选择,并且在这种情况下性能应该很好(即使地图会做得更好),但是如果您想获得最佳性能,那么 set 就是您要寻找的。

通常向量应该是默认容器,如果您遇到性能问题,那么您可以考虑使用不同的容器。

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2020-03-26
    • 2017-07-05
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多