快速文件解析 C++
Fast file parsing C++
我目前正在做一个项目,我必须读取几个大文件。我想问一下在C++中优化文件解析的一些最佳实践
在阅读了有关 fread、ifstream 等的一些基准测试 (example) 之后。我决定为此目的使用 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);
然后我会像这样使用 stringstream 来解析文件:
std::stringstream parser;
parser.rdbuf()->pubsetbuf(&buffer[0], length);
并继续使用 stringstream 解析器进行解析。
我的问题如下:
- 以上代码是将缓冲区复制到stringstream还是共享同一个缓冲区? (我不太清楚 pubsetbuf 的作用或效率如何)
- 有没有比使用 stringstream 更好的方法来做到这一点?
当我们知道一些无关信息的长度,即"irrelevant information, important information",我们希望得到重要的信息,我们可以这样做:
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
不会复制。有关详细信息,请参阅以下 link:
http://www.cplusplus.com/reference/streambuf/streambuf/pubsetbuf/
在文件中向前查找比读取文件之间的所有内容快(多)。严格来说,它不需要更快,但在所有通常的 OS 上,它几乎是恒定的时间(不是真的,但无论如何都与搜索长度不成比例)。如果只跳过一些字节,差异可能不会那么大,但距离越大,差异就越大。
取决于速度的重要性,
你的 OS 有一些更快的(但 OS 依赖)功能。
至于有没有更好的解析方式就看你的数据了。
你应该在单独的问题中提出这个问题。
我目前正在做一个项目,我必须读取几个大文件。我想问一下在C++中优化文件解析的一些最佳实践
在阅读了有关 fread、ifstream 等的一些基准测试 (example) 之后。我决定为此目的使用 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);
然后我会像这样使用 stringstream 来解析文件:
std::stringstream parser;
parser.rdbuf()->pubsetbuf(&buffer[0], length);
并继续使用 stringstream 解析器进行解析。
我的问题如下:
- 以上代码是将缓冲区复制到stringstream还是共享同一个缓冲区? (我不太清楚 pubsetbuf 的作用或效率如何)
- 有没有比使用 stringstream 更好的方法来做到这一点?
当我们知道一些无关信息的长度,即"irrelevant information, important information",我们希望得到重要的信息,我们可以这样做:
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
不会复制。有关详细信息,请参阅以下 link:
http://www.cplusplus.com/reference/streambuf/streambuf/pubsetbuf/
在文件中向前查找比读取文件之间的所有内容快(多)。严格来说,它不需要更快,但在所有通常的 OS 上,它几乎是恒定的时间(不是真的,但无论如何都与搜索长度不成比例)。如果只跳过一些字节,差异可能不会那么大,但距离越大,差异就越大。
取决于速度的重要性,
你的 OS 有一些更快的(但 OS 依赖)功能。
至于有没有更好的解析方式就看你的数据了。
你应该在单独的问题中提出这个问题。