将一个大文件加载到内存中并在程序的所有 运行 时间内保存它是否错误?
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。问题
- 与其将文件加载到内存中,不如直接从文件中搜索ids更好吗?这就像在程序和文本文件之间来回切换。
- 该文件将在程序的所有运行
内存中保存
这是一个非常主观的问题 - 如果您绝对需要最大(例如内存数据库)性能,则您不会有内存问题并且您不能更改磁盘上的数据表示,那么您的选择仅限于您已有的。
如果您的代码应该 运行 在有限的内存条件下,例如移动设备,那么您应该在文件中动态查找,这就是我们进入下一个选项的地方.
使用数据库解决方案并查询数据库以查找所需数据。你可以在数据库之上实现一个缓存层,或者你可以使用一个为你做一些缓存的数据库。 leveldb 是一个很好的、简单的基于文档的数据库库。 Sqlite 也是一个选项,尤其是当您需要关系数据库的功能时(这取决于您存储的数据结构)。这个选项肯定会胜过选项#2。
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。问题
- 与其将文件加载到内存中,不如直接从文件中搜索ids更好吗?这就像在程序和文本文件之间来回切换。
- 该文件将在程序的所有运行 内存中保存
这是一个非常主观的问题 - 如果您绝对需要最大(例如内存数据库)性能,则您不会有内存问题并且您不能更改磁盘上的数据表示,那么您的选择仅限于您已有的。
如果您的代码应该 运行 在有限的内存条件下,例如移动设备,那么您应该在文件中动态查找,这就是我们进入下一个选项的地方.
使用数据库解决方案并查询数据库以查找所需数据。你可以在数据库之上实现一个缓存层,或者你可以使用一个为你做一些缓存的数据库。 leveldb 是一个很好的、简单的基于文档的数据库库。 Sqlite 也是一个选项,尤其是当您需要关系数据库的功能时(这取决于您存储的数据结构)。这个选项肯定会胜过选项#2。