C++ 将一个大文件加载到内存中并在程序的所有运行时间内保留它是错误的吗? 1.加载文件

C++ 将一个大文件加载到内存中并在程序的所有运行时间内保留它是错误的吗? 1.加载文件,c++,memory,C++,Memory,我有一个大小为330MB的文件,我正在将其加载到multimap中,如下所示: // String = first column and vector<string> rest of the columns `typedef std::multimap<string, vector<string>> termF`; ifstream file("file.txt"); string line = ""; ter

我有一个大小为330MB的文件,我正在将其加载到multimap中,如下所示:

// String = first column and vector<string> rest of the columns
`typedef std::multimap<string, vector<string>> termF`;

ifstream file("file.txt");
  string line = "";
  termF tfidf;
  if (file.is_open())
  {
    while (file.good())
    {
      getline (file, line);
      vector<string> values;
      boost::split(values, line, boost::is_any_of(" "));
      string id = values[0];
      vector<string> vals;
      for(int i = 1; i < values.size(); i++)
      {
        vals.push_back(values[i]);
      }
      tfidf.insert(pair<string,vector<string>>(id, vals));
    }
    file.close();
  }
  return tfidf;
//String=第一列和向量列的其余部分
`typedef std::multimap termF`;
ifstream文件(“file.txt”);
字符串行=”;
termF tfidf;
if(file.is_open())
{
while(file.good())
{
getline(文件,行);
向量值;
boost::split(值、行、boost::是(“”)的任意值);
字符串id=值[0];
向量VAL;
对于(int i=1;i

2.搜寻 我有一个ID列表存储在
矢量ID
中。我想使用以下代码检查这些ID是否在多重映射中:

for(auto &id: ids)
{
  vector<string> values = tfidf.find(id)->second;
}
for(自动&id:id)
{
向量值=tfidf.find(id)->秒;
}

3.问题:
  • 与其将文件加载到内存中,不如直接从文件中搜索ID?这就像在程序和文本文件之间来回移动一样
  • 该文件将保存在内存中,供程序运行时使用
      • 这是一个非常主观的问题-如果您绝对需要最大的(如内存数据库)性能,您没有内存问题,您无法更改磁盘上的数据表示,那么您的选项仅限于您已经拥有的

      • 如果您的代码应该在有限的内存条件下运行,例如移动设备,那么您应该在文件中动态查找,这就是我们转到下一个选项的地方

      • 使用数据库解决方案并查询数据库以查找所需的数据。您可以在db上实现一个缓存层,也可以使用一个为您进行缓存的db。leveldb是一个好的、简单的基于文档的数据库库。Sqlite也是一个选项,特别是当您需要关系数据库的特性时(这取决于您存储的数据结构)。这个选项肯定会超过选项2


      我知道这取决于我的机器。我认为正如您提到的,使用关系数据库更好。该文件包含超过800000条记录。每次搜索文本文件都很昂贵。选项3在您的机器本身上要好得多,但在您希望在其上运行代码的设备类型上要好得多。移动设备(iPhone等)的内存比台式机、服务器和超级计算机少得多。然后我使用一个查询来搜索ID并加载其他列。程序运行更平稳。不再进行夯实。
      while(file.good())
      通常是错误的,可能会导致您将最后一行处理两次<代码>while(getline(file,line))
      会是一个更好的选择。我会在ty@RetiredNinja修改它