快速文件解析C++
Fast file parsing C++
我目前正在做一个项目,其中我必须读取几个大文件。我想问一下在C++中优化文件解析的一些最佳实践。
在阅读了一些关于fread、ifstream等的基准测试(示例)后,我决定将ifstream用于此目的(如果您认为有更好的方法,请指出任何改进)。到目前为止,我使用它的方式是这样的:
std::ifstream input_file ("some_file.txt");
input_file.seekg (0, input_file.end);
int length = input_file.tellg(); // Get the size of the buffer
input_file.seekg (0, input_file.beg);
std::vector<char> buffer (length);
input_file.read(&buffer[0], length);
然后我会使用字符串流来解析如下文件:
std::stringstream parser;
parser.rdbuf()->pubsetbuf(&buffer[0], length);
并使用字符串流解析器继续解析。
我提出的问题都很简单:
- 上面的代码是将缓冲区复制到字符串流,还是共享同一个缓冲区?(我不太清楚pubsetbuf是做什么的,也不太清楚它的效率有多高)
- 有没有比使用字符串流更好的方法
当我们知道一些不相关信息的长度,即"不相关信息,重要信息",并且我们希望获得重要信息时,我们可以这样做:
std::string container; parser.seekg(irrelevant_size, parser.cur); // irrelevant_size is the size // of irrelevant data std::getline(parser, container);
与相比,这有多有效
parser.get(temp_char_array, irrelevant_size + 1);
收集所有不相关的数据?
pubsetbuf
不会复制。有关详细信息,请参阅以下链接:
http://www.cplusplus.com/reference/streambuf/streambuf/pubsetbuf/
在文件中向前搜索要比读取其间的所有内容快得多。严格地说,它不需要更快,但在所有常见的操作系统上,它几乎是恒定的时间(不是真的,但与搜索长度无关)。如果只跳过一些字节,可能差异并不大,但距离越大,差异就越重要。
根据速度的重要性,
您的操作系统具有一些更快(但依赖于操作系统)的功能
是否有更好的解析方式取决于您的数据
你应该单独提问。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到