我目前正在编写一个程序,以读取大量文本文件,并搜索正则表达式,然后保存行文本和行号以及文件名和文件夹路径,以及将该数据写入.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?
答案 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上,更好的方法是并行处理多个文件。但是,实施起来有些困难。