在C ++中使用缓冲逐行读取巨大的文本文件

斯蒂芬·雅科文科(Stepan Yakovenko)

我需要在C ++中逐行从光盘读取巨大的35G文件。目前,我通过以下方式进行操作:

ifstream infile("myfile.txt");
string line;
while (true) {
    if (!getline(infile, line)) break;
    long linepos = infile.tellg();
    process(line,linepos);
}

尽管文件管理器以100Mb / s的速度复制文件,但是它却为我提供了大约2MB /秒的性能。我想这getline()没有正确地缓冲。请提出一种缓冲的逐行读取方法。

UPD:process()不是瓶颈,没有process()的代码以相同的速度工作。

斯蒂芬·雅科文科(Stepan Yakovenko)

我已经从我的Java项目中翻译了自己的缓冲代码,它可以满足我的需要。我必须放置定义来克服M $ VC 2010编译器tellg的问题,该问题在大型文件上总是给出错误的负值。尽管它做了一些无用的new [],但该算法仍可提供所需的〜100MB / s的速度。

void readFileFast(ifstream &file, void(*lineHandler)(char*str, int length, __int64 absPos)){
        int BUF_SIZE = 40000;
        file.seekg(0,ios::end);
        ifstream::pos_type p = file.tellg();
#ifdef WIN32
        __int64 fileSize = *(__int64*)(((char*)&p) +8);
#else
        __int64 fileSize = p;
#endif
        file.seekg(0,ios::beg);
        BUF_SIZE = min(BUF_SIZE, fileSize);
        char* buf = new char[BUF_SIZE];
        int bufLength = BUF_SIZE;
        file.read(buf, bufLength);

        int strEnd = -1;
        int strStart;
        __int64 bufPosInFile = 0;
        while (bufLength > 0) {
            int i = strEnd + 1;
            strStart = strEnd;
            strEnd = -1;
            for (; i < bufLength && i + bufPosInFile < fileSize; i++) {
                if (buf[i] == '\n') {
                    strEnd = i;
                    break;
                }
            }

            if (strEnd == -1) { // scroll buffer
                if (strStart == -1) {
                    lineHandler(buf + strStart + 1, bufLength, bufPosInFile + strStart + 1);
                    bufPosInFile += bufLength;
                    bufLength = min(bufLength, fileSize - bufPosInFile);
                    delete[]buf;
                    buf = new char[bufLength];
                    file.read(buf, bufLength);
                } else {
                    int movedLength = bufLength - strStart - 1;
                    memmove(buf,buf+strStart+1,movedLength);
                    bufPosInFile += strStart + 1;
                    int readSize = min(bufLength - movedLength, fileSize - bufPosInFile - movedLength);

                    if (readSize != 0)
                        file.read(buf + movedLength, readSize);
                    if (movedLength + readSize < bufLength) {
                        char *tmpbuf = new char[movedLength + readSize];
                        memmove(tmpbuf,buf,movedLength+readSize);
                        delete[]buf;
                        buf = tmpbuf;
                        bufLength = movedLength + readSize;
                    }
                    strEnd = -1;
                }
            } else {
                lineHandler(buf+ strStart + 1, strEnd - strStart, bufPosInFile + strStart + 1);
            }
        }
        lineHandler(0, 0, 0);//eof
}

void lineHandler(char*buf, int l, __int64 pos){
    if(buf==0) return;
    string s = string(buf, l);
    printf(s.c_str());
}

void loadFile(){
    ifstream infile("file");
    readFileFast(infile,lineHandler);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用fscanf在C中逐行读取文本文件

来自分类Dev

C ++逐行读取文本文件

来自分类Dev

文本文件:逐行读取C#

来自分类Dev

在C#中使用环境变量从文本文件读取文件路径

来自分类Dev

在C#中使用环境变量从文本文件读取文件路径

来自分类Dev

在C中使用fgets读取文本文件直到EOF

来自分类Dev

在 C++ 中使用 std::ifstream 读取 ASCII 文本文件

来自分类Dev

在 C++ 中使用 Visual Studio 读取文本文件时遇到问题

来自分类Dev

C ++,逐行读取文本文件后,vector中出现错误

来自分类Dev

逐行读取文本文件并保存到数组(C语言)

来自分类Dev

在C语言中逐行读取带有strtol的文本文件

来自分类Dev

读取文本文件并在C ++中逐行返回字数统计

来自分类Dev

从巨大的文本文件(c#4.0)中读取特定行

来自分类Dev

如何读取已在使用的文本文件(Windows C ++)

来自分类Dev

使用C#从文本文件读取

来自分类Dev

使用scanf重新读取c中的文本文件

来自分类Dev

使用C程序读取文本文件中的表

来自分类Dev

使用C从文本文件读取输入参数

来自分类Dev

读取文本文件C#

来自分类Dev

读取文本文件错误C

来自分类Dev

从文本文件C ++读取输入

来自分类Dev

用 C 读取文本文件

来自分类Dev

处理巨大的文本文件,C#。修改文件

来自分类Dev

逐行修改c ++中文本文件的内容

来自分类Dev

在C编程中使用结构的双指针将文本文件中的Matrix读取为2D数组

来自分类Dev

逐行读取文本文件(带有整数),并将每一行存储为向量(C ++)

来自分类Dev

使用 C++ 读取文本文件以读取特定关键字后面的值

来自分类Dev

在c#中分别读取文本文件和访问文本文件的元素

来自分类Dev

在c中逐行从另一个文本文件写入文本文件

Related 相关文章

  1. 1

    使用fscanf在C中逐行读取文本文件

  2. 2

    C ++逐行读取文本文件

  3. 3

    文本文件:逐行读取C#

  4. 4

    在C#中使用环境变量从文本文件读取文件路径

  5. 5

    在C#中使用环境变量从文本文件读取文件路径

  6. 6

    在C中使用fgets读取文本文件直到EOF

  7. 7

    在 C++ 中使用 std::ifstream 读取 ASCII 文本文件

  8. 8

    在 C++ 中使用 Visual Studio 读取文本文件时遇到问题

  9. 9

    C ++,逐行读取文本文件后,vector中出现错误

  10. 10

    逐行读取文本文件并保存到数组(C语言)

  11. 11

    在C语言中逐行读取带有strtol的文本文件

  12. 12

    读取文本文件并在C ++中逐行返回字数统计

  13. 13

    从巨大的文本文件(c#4.0)中读取特定行

  14. 14

    如何读取已在使用的文本文件(Windows C ++)

  15. 15

    使用C#从文本文件读取

  16. 16

    使用scanf重新读取c中的文本文件

  17. 17

    使用C程序读取文本文件中的表

  18. 18

    使用C从文本文件读取输入参数

  19. 19

    读取文本文件C#

  20. 20

    读取文本文件错误C

  21. 21

    从文本文件C ++读取输入

  22. 22

    用 C 读取文本文件

  23. 23

    处理巨大的文本文件,C#。修改文件

  24. 24

    逐行修改c ++中文本文件的内容

  25. 25

    在C编程中使用结构的双指针将文本文件中的Matrix读取为2D数组

  26. 26

    逐行读取文本文件(带有整数),并将每一行存储为向量(C ++)

  27. 27

    使用 C++ 读取文本文件以读取特定关键字后面的值

  28. 28

    在c#中分别读取文本文件和访问文本文件的元素

  29. 29

    在c中逐行从另一个文本文件写入文本文件

热门标签

归档