读取大文件中一行的前N个字符的最快方法是什么?

时间:2011-04-05 06:48:07

标签: c++ file

E.g。你有一个3行数百万字符的文件。 读取第2行的前N个字符的最快/最有效的方法是什么?

5 个答案:

答案 0 :(得分:3)

没有好办法。行结尾只是您必须扫描文件的另一个字符组合。可以对如何读取文件进行一些性能调整,例如使用内存映射。

如果文件在读取之间没有变化,则创建包含换行符位置的单独索引文件将在下次保存扫描时间。如果您可以控制文件写入,则可以在编写文件时创建索引(在单独的文件中或在标题中)。

乔尔在这个问题上写了blog post

答案 1 :(得分:3)

要么你对断线的位置有所了解......

  • 行长度相等,因此将文件大小除以3并寻找该地址
  • 只有一行很长,但你不确定哪一行,所以从文件的开头和结尾读取一个块,找出它是哪一行

...或者你完全处于黑暗之中,只需扫描你的路,直到找到第一个换行符:

  • 使用内存映射I / O以获得最快的扫描速度,AND
  • 告诉操作系统(如果它允许你)你正在进行顺序读取,这样它就不会使用你扫描过去的文件数据充斥其缓存而不再需要(例如在Linux上,使用madvise() - http://linux.die.net/man/2/madvise

答案 2 :(得分:2)

使用ifstream::ignore()

#include <iostream>
#include <fstream>
#include <limits>

using namespace std;

int main(int, char* []) {
    ifstream file("file.txt");

    // skip first line
    file.ignore(numeric_limits<streamsize>::max(), '\n');

    // print next N characters
    const int N = 15;
    char s[N];
    file.get(s, N);
    cout << s << "\n";

    return 0;
}

答案 3 :(得分:1)

读完第1行的所有字符后?

开玩笑......如何将读取大小与文件系统的块大小相匹配。你仍然需要寻找第一行,但这将是最有效的方法

如果您知道第一行的实际长度,您可以在不读取数据的情况下寻找它。

答案 4 :(得分:1)

我认为查找然后通过char读取char是好的,如果你知道你的行的下限,寻找那个界限然后开始读到下一行(对于3行文件的第2行)。