读取10GB二进制文件并解析每个字节而不使用boost库的最简单方法是什么?迭代10GB +二进制文件
及其与流如此混乱,文件,内存映射文件等
我真的只是想是这样的:
char* buffer = read(filename, binary);
while(buffer != EOF){
//Read byte
++buffer;
}
性能此事确实只是由于文件大小。
读取10GB二进制文件并解析每个字节而不使用boost库的最简单方法是什么?迭代10GB +二进制文件
及其与流如此混乱,文件,内存映射文件等
我真的只是想是这样的:
char* buffer = read(filename, binary);
while(buffer != EOF){
//Read byte
++buffer;
}
性能此事确实只是由于文件大小。
结束),使用fread()
。您可以在std::shared_ptr
的FILE*
存储RAII:
std::shared_ptr<FILE> file(fopen(...), fclose);
可以忽略C++流,内存映射文件,升压,等等这些都不将比fread()
更快。
*“这些都不会比fread()快”* - 我们需要这种[ipsedixitism]的证据(https://en.wikipedia.org/wiki/Ipse_dixit)。有一些数字来支持你的陈述? – WhiZTiM
@WhiZTiM:我已经多次测试过这些东西。任何想在自己的特定平台上100%确定自己特定用例的人都欢迎编写自己的基准测试。 –
当你不关心性能,
一个简单的while循环与ifstream
可以一次提取一个字节:如果你想表现好顺序访问(从一开始就向着读取
#include <iostream>
#include <fstream>
int main(){
std::ifstream infile("file.txt");
while (infile){
//get next byte
char c;
infile.get(c);
//process byte
std::cout << c;
}
}
当然,您一次不会读取一个10 GB的输入文件。 –
@JohnZwinck为什么不呢?为你做的实际I/O的代码知道得更好,并且会根据需要读取有效大小的块,除非你明确地告诉它不这样做。我可以想象大量的应用程序需要逐字节读取。 –
@CareyGregory没有人会“要求”它。 – xaxxon
std :: ifstream有什么问题? –
对于简单的块我总是回到C和无缓冲FILE *处理。 – Lothar
内存映射文件是最好的。 – Jichao