在c ++中提高ifstream的性能

时间:2011-04-18 21:44:34

标签: c++

如果这个问题有点模糊或者只是简单的愚蠢我很抱歉,我仍然是一个新手。

我需要从c ++中的Web日志文件中提取信息。字符串操作是相对的,不及时访问数据。 我目前在做什么

string str;

ifstream fh("testlog.log",ios::in);

while (getline(fh,str));

从这里我从字符串中获取有用的数据。这适用于具有100个条目的日志文件,但永远需要具有数百万个条目的日志文件。 非常感谢任何帮助

4 个答案:

答案 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");
}