读取大量文本/文本文件的更快方法?

时间:2019-04-16 12:04:40

标签: c++

我目前正在编写一个程序,以读取大量文本文件,并搜索正则表达式,然后保存行文本和行号以及文件名和文件夹路径,以及将该数据写入.csv文件。我使用的方法如下:


    string line;
    ifstream stream1(filePath)
    {  
        while (getline(stream1,line))
        { 
            // Code here that compares regular search expression to the line
            // If match, save data to a tuple for later writing to .csv file.
        } 
    }

我想知道是否有更快的方法可以做到这一点。我使用上述相同的逻辑在Matlab中编写了相同类型的程序(我对此比较有经验),并逐行进行。对于300 MB的数据,我的运行时间大约缩短为5.5分钟(我甚至不确定这是否快,也许不是),但是在Visual Studio中,相同的数据最多要花费2个小时。

我听说过C ++对于数据读取/写入有多快,所以我对这些结果感到有些困惑。有没有更快的方法?我尝试在线浏览,但发现的只是内存映射,它似乎仅是Linux / Unix?

1 个答案:

答案 0 :(得分:0)

您可以使用内存映射文件。

由于您使用的是Windows,因此正确的API可能是CAtlFileMapping<char>模板类。这是一个例子。

#include <atlfile.h>

// Error-checking macro
#define CHECK( hr ) { const HRESULT __hr = ( hr ); if( FAILED( __hr ) ) return __hr; }

HRESULT testMapping( const wchar_t* path )
{
    // Open the file
    CAtlFile file;
    CHECK( file.Create( path, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING ) );
    // Map the file
    CAtlFileMapping<char> mapping;
    CHECK( mapping.MapFile( file ) );
    // Query file size
    ULONGLONG ullSize;
    CHECK( file.GetSize( ullSize ) );

    const char* const ptrBegin = mapping;
    const size_t length = (size_t)ullSize;
    // Process the mapped data, e.g. call memchr() to find your new lines

    return S_OK;
}

别忘了对于32位进程,地址空间是有限的,对于该应用程序,编译64位程序非常有意义。

此外,如果文件很小,则文件数量很多,并且将它们存储在快速SSD上,更好的方法是并行处理多个文件。但是,实施起来有些困难。