将一个大文件加载到内存中并在程序的所有运行时间内保持它是错误的

Is loading a big file into memory and keeping it for all the running time of the program wrong?

本文关键字:运行时间 程序 错误 一个 文件 内存 加载      更新时间:2023-10-16

1。加载文件

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

// 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;

2.搜索

我有一个存储在vector<string> ids中的ID列表。我想通过使用以下代码来检查这些id是否在多映射中:

for(auto &id: ids)
{
  vector<string> values = tfidf.find(id)->second;
}

3.问题

  • 与其将文件加载到内存中,不如直接从文件中搜索id?这就像是在程序和文本文件之间来回切换
  • 此文件将保存在内存中,用于程序的所有运行
  • 这是一个非常主观的问题——如果你绝对需要最大限度的(例如内存数据库)性能,你没有内存问题,也不能改变你在磁盘上的数据表示,那么你的选择仅限于你现有的。

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

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