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

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

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 是否在 multimap 中:

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

3。问题

  • 这是一个非常主观的问题 - 如果您绝对需要最大(例如内存数据库)性能,则您不会有内存问题并且您不能更改磁盘上的数据表示,那么您的选择仅限于您已有的。

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

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