将一个大文件加载到内存中并在程序的所有运行时间内保持它是错误的
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是否在多映射中:
for(auto &id: ids)
{
vector<string> values = tfidf.find(id)->second;
}
3.问题
- 与其将文件加载到内存中,不如直接从文件中搜索id?这就像是在程序和文本文件之间来回切换
- 此文件将保存在内存中,用于程序的所有运行
-
这是一个非常主观的问题——如果你绝对需要最大限度的(例如内存数据库)性能,你没有内存问题,也不能改变你在磁盘上的数据表示,那么你的选择仅限于你现有的。
-
如果你的代码应该在有限的内存条件下运行,比如移动设备,那么你应该在文件中动态查找,这就是我们进入下一个选项的地方。
-
使用数据库解决方案并查询数据库以查找所需的数据。您可以在数据库之上实现一个缓存层,也可以使用一个为您进行缓存的数据库。leveldb是一个好的、简单的基于文档的数据库库。Sqlite也是一种选择,尤其是当您需要关系数据库的功能时(这取决于您存储的数据结构)。这个选项肯定会击败选项#2。
相关文章:
- 用时钟测量程序的运行时间
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 如何执行用 C++ 编写的程序的运行时间?
- 如何优化C++键值程序以获得更快的运行时间
- 同一程序的运行时间差异很大,有时达到1000+us
- 测量 OpenCL 应用程序的运行时间
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- 如何在以下C程序中计算运行时间内存和最大数据存储器使用情况
- 使用Clock()函数测量程序的运行时间
- 对于长时间运行的程序,STL 内存管理是否"reliable"?
- 测量 C++ 多线程程序中的运行时间
- 运行时间错误:程序跳过提示,以获取第二名和第三个名称
- 将一个大文件加载到内存中并在程序的所有运行时间内保持它是错误的
- 如果你以root用户身份运行这个C++程序,为什么它要花这么长时间才能完成
- 为什么我的C++程序使用的系统时间比运行时间多
- 与linux相比,cygwin中的c++程序运行时间较长
- 如何分析程序运行时间
- 计算并行程序的运行时间和cpu时间
- 如何为长时间运行的程序执行文件输出
- 使用 Unix 程序时间计算每次迭代的程序运行时间