你有什么关于如何提高性能的想法吗?
附注:我一直在考虑在程序处理数据时使用后台子进程(或线程)来读/写数据块,但我不知道(主要是在子进程的情况下)是否值得这样做。
一个2GB的文件相当大,你需要考虑所有可能会成为瓶颈的因素:
我建议首先进行一些测量:
'dd' 命令读写磁盘的速度有多快?示例...
dd if=/dev/zero bs=1024 count=2000000 of=file_2GB
假设您的磁盘能够以大约40Mb/s的速度读/写(这可能是一个合理的起点),那么您的2GB文件最快也不会超过50秒。
实际上需要多长时间呢?
嗨Roddy,使用fstream读取方法和 大缓冲区(128,255或512 MB)的1.1 GB文件需要 大约43-48秒,使用fstream getline(line by line)也是一样。 cp需要将近2分钟来复制文件。
这种情况下,你的硬件已经达到了极限。cp需要读取和写入,当它这样做时将在磁盘表面上前后寻找,导致速度变慢。所以像你看到的那样,它会比简单的“读”情况至少慢两倍。
为了提高速度,我建议首先尝试更快的硬盘或SSD。
您没有说明磁盘接口是什么?SATA几乎是最简单/最快的选择。此外(显而易见的一点...),请确保磁盘物理上与运行代码的机器相同,否则您将受到网络限制...
我建议使用内存映射文件,但如果你要使用boost库,我认为boost::iostreams::mapped_file比boost::interprocess更适合。
仅供参考,避免使用std::endl,因为这会在缓冲区满之前强制刷新。取而代之的是使用'\n'来表示换行。
unsigned int buffer_size = 64 * 1024 * 1024; // 64 MB for instance.
std::vector<char> data_buffer(buffer_size);
_file->read(&data_buffer[0], buffer_size);
请阅读关于使用下划线作为标识符命名的规则的文章。请注意,您的代码是正确的,但需要改进。
使用getline()可能效率低下,因为字符串缓冲区可能需要多次重新调整大小,以便从流缓冲区中附加数据。您可以通过预先设置字符串大小来使其更有效:
此外,您还可以将iostreams缓冲区的大小设置为非常大或NULL(用于无缓冲)
// Unbuffered Accesses:
fstream file;
file.rdbuf()->pubsetbuf(NULL,0);
file.open("PLOP");
// Larger Buffer
std::vector<char> buffer(64 * 1024 * 1024);
fstream file;
file.rdbuf()->pubsetbuf(&buffer[0],buffer.size());
file.open("PLOP");
std::string line;
line.reserve(64 * 1024 * 1024);
while(getline(file,line))
{
// Do Stuff.
}