Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;读取大文本文件_C++_Performance - Fatal编程技术网

C++ C++;读取大文本文件

C++ C++;读取大文本文件,c++,performance,C++,Performance,我有一个大约20GB的非常大的文本文件。 此文件包含多个文本行 我需要把这个文件分块读入内存。每个数据块都足够放入主内存 最有效的方法是什么? -读入缓冲区,然后将数据解析成CAR+的C++向量。 -逐行读取文件并放入上面的向量 -或者其他方法?最有效的方法是将数据块或数据块读入缓冲区,而不是扫描缓冲区 I/O具有开销成本,每个请求可以获取的数据越多越好 在内存中搜索总是比一次从输入中读取一个字符更快 注意两种情况: 一行继续经过缓冲区的末尾 缓冲区没有填满 编辑1:内存映射 另一种选择是让操作

我有一个大约20GB的非常大的文本文件。 此文件包含多个文本行

我需要把这个文件分块读入内存。每个数据块都足够放入主内存

最有效的方法是什么? -读入缓冲区,然后将数据解析成CAR+的C++向量。 -逐行读取文件并放入上面的向量
-或者其他方法?

最有效的方法是将数据块或数据块读入缓冲区,而不是扫描缓冲区

I/O具有开销成本,每个请求可以获取的数据越多越好

在内存中搜索总是比一次从输入中读取一个字符更快

注意两种情况:

  • 一行继续经过缓冲区的末尾
  • 缓冲区没有填满 编辑1:内存映射
    另一种选择是让操作系统将文件视为内存。本质上,操作系统将根据需要处理文件的块或块读取


    您必须测量性能(即配置文件),以找出哪种方法更有效以及效率有多高。

    这只是在答案中添加一些代码:

    #include <fstream>
    #include <iostream>
    
    const static size_t numToReadAtATime = 4;
    
    int main()
    {
        std::ifstream s{ "filename.dat" }; 
    
        while(true)
        {
    
            char nextChars[numToReadAtATime];
    
            if(s.readsome(nextChars, numToReadAtATime) != numToReadAtATime)
                break;
    
            //  dostuff with nextChars
    
        }
    
    }
    
    #包括
    #包括
    常量静态大小\u t numToReadAtATime=4;
    int main()
    {
    std::ifstreams{“filename.dat”};
    while(true)
    {
    char nextChars[numToReadAtATime];
    if(s.readsome(nextChars,numToReadAtATime)!=numToReadAtATime)
    打破
    //用nextChars的dostuff
    }
    }
    
    我认为您没有20GB的文本文件。除此之外,为什么不尝试任何一种方法并对其进行分析呢。或者,如果它是一次性的,就让它在周末运行,例如“C++字符向量[]”-请告诉我,您刚才输入错误,并且实际上知道
    std::string
    std::vector
    ,以及
    char[]
    的缺点……我只是认为字符数组比std::string快。对于I/O缓冲区,不要费心于
    std::vector
    std::string
    。使用字符数组。另外,分配一次并重新使用。谢谢。现在我有了更好的办法。
    std::ifstream
    已经在做缓冲了。在上面添加另一层缓冲是没有意义的。这不是缓冲的问题,而是缓冲的大小。例如,一个自缓冲方案将允许512MB的缓冲区,而我不相信
    std::ifstream
    会使用那么大的缓冲区。是的,
    std::ifstream
    上游有更多的缓冲区。在一般情况下,std::ifstream缓冲区是通用的,以获得最佳性能(因此在特定情况下可能更好)。但只要给它一个更大的缓冲。无需实现自己的缓冲区。