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

Faster methods of reading a large amount of text/text files?

本文关键字:文本 方法 文件 读取      更新时间:2023-10-16

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

弦线; ifstream stream1(filePath) {  而 (getline(stream1,line)) { 此处将正则搜索表达式与行进行比较的代码 如果匹配,请将数据保存到元组,以便以后写入.csv文件。 } }

我想知道是否有更快的方法来做到这一点。我在 Matlab 中编写了相同类型的程序(我对此更有经验),使用与上述相同的逻辑,逐行进行。对于 300 MB 的数据,我的运行时间缩短到大约 5.5 分钟(我什至不确定这是否快,可能不是),但在 Visual Studio 中,相同的数据需要长达 2 小时。

我听说过C++读取/写入数据的速度有多快,所以我对这些结果有点困惑。有没有更快的方法?我试着在网上四处寻找,但我发现的只是内存映射,似乎只有Linux/Unix?

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

由于您使用的是 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 上,更好的方法是并行处理多个文件。但它更难实现。