C++ io 流与 mmap

C++ io streams versus mmap

我正在用 C++ 启动一个用于键值存储的小项目。我想知道 C++ std 流在可伸缩性和性能方面与 mmap 相比如何。与使用 mmap/lseek 相比,在不适合 RAM 的文件上使用 ifstream::seekg 有何不同?

最终,任何 Linux 用户态应用程序都在使用 syscalls(2),包括 C++ I/O 库。

精心 mmapmadvise(或 lseek + read & posix_fadvise)可能比 C++ 流(使用 read 和其他 syscalls(2)... 更有效);但是滥用系统调用(例如 read-ing 太小的缓冲区)会导致灾难性的性能

另外,Linux有很好的page cache (used to contain parts of recently accessed file data). And performance also depends upon the file system(而且硬件-SSD和机械硬盘是不同的野兽-和电脑)

也许你不应该重新发明你自己的东西并使用sqlite, or gdbm, or redis, or mongodb, or postgresql, or memcached,等等...

性能和取舍在很大程度上取决于实际使用情况(笔记本电脑上的单个 4GB 日志文件与数据中心中数 PB 的视频或基因组数据不同)。所以进行基准测试(并注意像我提到的那样的许多工具都可以进行明智的调整)。