如何在 C++ 中编译具有大量数据的向量?

Posted

技术标签:

【中文标题】如何在 C++ 中编译具有大量数据的向量?【英文标题】:How to compile a vector with huge amount of data in C++? 【发布时间】:2012-07-17 22:25:55 【问题描述】:

我正在编写一个 C++ 程序来检查加泰罗尼亚语中是否存在某些单词,所以我有一个带有加泰罗尼亚语词典的向量:

const vector<string> dict="aaron","ababol","abac","abaca","abacallanada","abacallanava","abacas","abacial", ... ,"zum-zum","zur","zuric","zwitterio";

问题是字典有107776个条目,所以当我尝试编译文件时:

g++ -Wall file.cc -std=c++0x -o file.exe

它在一段时间内什么都不做,然后 Windows 说它没有响应并关闭它。

如何编译它?有没有更好的方法来存储这种类型的数据(数组,...)?

【问题讨论】:

将它们放在一个文件中并在运行时解析它? 我会让你的程序读取包含字典的文件。也使字典更易于维护。 将大量数据编译成二进制文件有很多缺点,但优点很少。考虑不要这样做! 嗯,我目前正在编译一个巨大的数组,生成一个 5MB 的目标文件,这对我来说大约需要三到四秒。 您是通过 IDE 编译它吗?也许在命令行上可能会更好(Cygwin 并在后台运行)? 【参考方案1】:

使用老式内置数组可能会更幸运:

char const * const dict[] = "aaron",...;

这将生成大量字符串文字和指向它们的指针数组,这对编译器来说应该不会造成太大压力。这也不会使用不必要的内存,在运行时几乎没有工作。

或者,std::array&lt;char const *&gt; 应该同样高效,具有更多 C++ 外观和感觉。

您的版本还必须生成大量代码才能从这些代码中构建一个initializer_list,从每个代码中构造一个字符串,并将每个字符串添加到向量中。它还需要两倍于每个字符串文字需要复制到运行时分配的内存中的内存,然后所有这些指针都需要存储在另一个运行时分配的数组中。

缺点是每次从字典中读取时,您最终可能会构建一个临时字符串。如果这是一个问题,那么 std::string 数组可能是一个合理的折衷方案。

【讨论】:

谢谢!使用您的代码,编译过程将持续几秒钟!【参考方案2】:

将其存储在外部文件中,并按需加载。这是最好的解决方案,否则我想您应该将向量拆分为多个向量,然后将它们放入单独的 cpp 文件中。

【讨论】:

好的,但是为什么呢?如果 Firefox(在 javascript 中非常慢)可以轻松处理这么多数据,为什么编译器不能呢?如果字典是按需读取而不是之前编译,会不会更慢? @Oriol 正如您已经发现的那样,编译器无法处理它。所以这不是性能问题。【参考方案3】:

将字典存储在文本文件中,每行一个单词。然后将此代码添加到您的程序中:

 
  std::string inputFileName;
  std::ifstream inputFile(inputFileName);
  std::string word;
  while( std::getline(inputFile, word) )
    dict.push_back(word);

【讨论】:

我更喜欢从一对std::istream_iterator&lt;std::string&gt;s 构建字典,它会为您处理moves。此答案中的代码会左右复制字符串。 它让你看起来更聪明。 如果可以保证输入没有嵌入空格,我也会这样做。我对加泰罗尼亚语词汇不熟悉,所以我使用了getline【参考方案4】:

是否可以使用其他答案中的方法从文件中仅加载一组字典,即从文件a.dic 中仅加载“a”字。还是您需要一次访问整个字典?

【讨论】:

以上是关于如何在 C++ 中编译具有大量数据的向量?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 在 C++ 中绘制具有大量数据点的散点图的最佳方法

如何在 Python 中快速计算大量向量的余弦相似度?

C++ 将大量向量转换为字符向量的最有效方法

如何在 Qt C++ 应用程序中显示具有大量小部件的可滚动列表作为项目?

用 C++ 将数据写入文件 - 最有效的方法?

哪个向量和地图,使用更少的内存(大量数据和未知大小)