如果这个问题有点模糊或者只是简单的愚蠢我很抱歉,我仍然是一个新手。
我需要从c ++中的Web日志文件中提取信息。字符串操作是相对的,不及时访问数据。 我目前在做什么
string str;
ifstream fh("testlog.log",ios::in);
while (getline(fh,str));
从这里我从字符串中获取有用的数据。这适用于具有100个条目的日志文件,但永远需要具有数百万个条目的日志文件。 非常感谢任何帮助
答案 0 :(得分:2)
我真的怀疑I / O对你的伤害超过ifstream
。您是否检查过您实际上是CPU绑定的?很可能你有磁盘和缓存局部性问题。
在这种情况下你可能做不了多少。
如果它是CPU绑定的,你是否已经分析了CPU时间的去向?
答案 1 :(得分:1)
这是我发现提取文件的最快方法:
std::ifstream file("test.txt", std::ios::in | std::ios::end);
std::size_t fileSize = file.tellg();
std::vector<char> buffer(fileSize);
file.seekg(0, std::ios::beg);
file.read(buffer.data(), fileSize);
std::string str(buffer.begin(), buffer.end());
然而,如果您的文件真的那么大,我强烈建议您将其作为流来操纵......
答案 2 :(得分:1)
在浪费了数小时的时间之后,我在Quincy2005中编译了相同的代码而不是Microsoft Visual Studio。结果是戏剧性的。从40分钟的执行时间到1分钟。通过将文件处理程序的指针传递给getline函数,可以在Microsoft Visual Studio中完成一些改进。在基于Linux的系统上,执行大约需要40秒。为了浪费我的时间,我诅咒微软40分钟。
答案 3 :(得分:1)
@Errata:
你确定,你的代码比说:
更快std::ifstream in("test.txt");
in.unsetf(std::ios::skipws);
std::string contents;
std::copy(
std::istream_iterator<char>(in),
std::istream_iterator<char>(),
std::back_inserter(contents));
此外,OP需要按行访问,这将方便地完成:
std::ifstream in("test.txt");
in.unsetf(std::ios::skipws);
size_t count = std::count_if(
std::istream_iterator<std::string>(in),
std::istream_iterator<std::string>(),
&is_interesting);
std::cout << "Interesting log lines: " << count << std::endl;
当然定义一个谓词,例如
static bool is_interesting(const std::string& line)
{
return std::string::npos != line.find("FATAL");
}