读取大量文本/文本文件的更快方法?
Faster methods of reading a large amount of text/text files?
我目前正在制作一个程序来读取大量文本文件,并搜索正则表达式,然后保存行文本和行号,以及文件名和文件夹路径,并将该数据写入.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 上,更好的方法是并行处理多个文件。但它更难实现。
相关文章:
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 有没有一种方法可以使用图形在C++中逐个字母地打印控制台中的文本
- 将QDomDocument数据用作文本的更好方法
- Qt cpp - 将QString写入文本文件的干净方法
- 以 LPCTSTR 开头编写另一行文本的最佳方法是什么?
- 有什么方法可以在C++中读取文本并执行这样的代码命令吗?
- 是否有任何方法可以在用户输入文本时读取字符
- 什么是阅读和将信息与此文本文件分开的好方法
- 是否有一种方法可以从文本文件中读取并将单个数据存储为不同的变量
- 读取大量文本/文本文件的更快方法?
- 有没有更好的方法可以从静态和非静态函数返回相同的字符串文本
- 有关读取 UTF-8 编码文本时 Ifstream get() 方法行为的说明 (C++)
- DirectWrite GDI 互操作:使用"IDWriteFontFace"绘制文本的简单方法
- 使用OpenCV检测图像中垂直文本的方法
- Qt. 方法显示文本() 如果我在 QStyledItemDelegate 中定义了 paint() 方法不起作用
- 将文本文件读取为字符串的最短方法
- 有没有一种方法可以使用预处理器将文本资源拉入原始字符串
- 在自定义文本区域中呈现光标的正确方法
- 编译器未将指向字符串文本的良好指针解释为方法的参数
- 有没有任何方法可以从C++中的文本中提取URL