【问题标题】:C++ io streams versus mmapC++ io 流与 mmap
【发布时间】:2016-03-02 19:22:32
【问题描述】:

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

【问题讨论】:

  • 为什么不做个小测试看看呢?无论如何,有很多变量,比如可移植性、分布、要解决的实际问题等等。
  • 什么样的数据?什么尺寸?什么电脑?
  • 这在stackoverflow.com/questions/5588605/mmap-vs-read 中基本涵盖,尽管 iostreams 引入了额外的读取开销。

标签: c++ io iostream mmap


【解决方案1】:

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

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

另外,Linux 有一个很好的page cache(用来包含最近访问的文件数据的一部分)。而且性能还取决于file system(以及硬件-SSD和机械硬盘是不同的野兽-和计算机)。

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

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

【讨论】:

    猜你喜欢
    • 2011-07-16
    • 2010-12-16
    • 2014-03-09
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多