情况是:有一个文件包含14 294 508个无符号整数和13 994 397个浮点数(需要读取double
s)。文件总大小约为250 MB。
使用std::istream
大约需要30秒。从文件到内存读取数据(只是复制字节,没有格式化输入)要快得多。有没有办法在不改变文件格式的情况下提高阅读速度?
答案 0 :(得分:3)
您需要使用STL样式的i / o吗?您必须从其中一位专家那里查看this优秀作品。这是Dietmar Kuhl的专业iostream
。
我讨厌建议这个,但看看C格式的i / o例程。另外,你是否一次性阅读整个文件?
答案 1 :(得分:1)
您可能还想看一下Matthew Wilson的FastFormat库:
我没有使用它,但他做了一些相当令人印象深刻的声明,我发现他的很多其他工作值得学习和使用(偶尔偷窃)。
答案 2 :(得分:1)
您尚未指定格式。您可以将内存映射到它,或者可以读取非常大的块并以批处理算法进行处理。
此外,您还没有说过您是否确定将要读取它的文件和进程将在同一平台上。如果一个big-endian进程写入它并且一个little-endian进程读取它,反之亦然,它就胜利了。
答案 3 :(得分:1)
与“通用”读取方法相比,自己解析输入(atoi& atof)通常会提高速度至少两倍。
答案 4 :(得分:0)
快速而又脏的是将文件转储到标准C ++字符串中,然后在其上使用字符串流:
#include <sstream>
// Load file into string file_string
std::stringstream s( file_string );
int x; float y;
s >> x >> y;
这可能不会给你带来很大的性能提升(你会通过避免iostream来获得更大的加速),但它很容易尝试,而且可能更快。