我正在用C ++开始一个关键值存储的小项目。我想知道C ++ std流在可伸缩性和性能方面与mmap相比如何。与使用mmap / lseek相比,如何在不适合RAM的文件中使用ifstream :: seekg?
答案 0 :(得分:2)
最终,任何Linux用户登陆应用程序都在使用syscalls(2),包括C ++ I / O库。
非常谨慎,mmap
和madvise
(或lseek
+ read
& posix_fadvise
)可能更有效率C ++流(使用read
和其他syscalls(2) ...);但滥用系统调用(例如read
- 缓冲区太小)可能会带来灾难性的性能
此外,Linux有一个非常好的page cache(用于包含最近访问的文件数据的一部分)。性能还取决于file system(硬件-SSD和机械硬盘是不同的野兽和计算机)。
也许你不应该重新发明自己的东西并使用sqlite,gdbm,redis,mongodb或postgresql或{{ 3}}等等......
性能和权衡取决于实际使用(笔记本电脑上的单个4Gbytes日志文件与数据中心中的PB级视频或基因组数据不同)。所以基准测试(注意许多工具,比如我提到的工具可以明智地调整)。