c++ - 在 C++ 中,将大型二进制 (1GB-4GB) 文件加载到内存中的最快方法是什么?

标签 c++ linux posix

在 Linux 64 位(例如 Amazon EC2 实例)上,我需要将几个大型二进制文件加载到内存中。最快的方法是什么?

  • ifstream
  • 害怕
  • POSIX 开放
  • POSIX mmap(实际上并没有将整个文件加载到内存中,这会影响性能)
  • 还有别的吗?

此外,节点可能会或可能不会再次启动此可执行文件,因此如果文件在后续尝试中加载得更快,将会有所帮助。某种预加载步骤甚至可能起作用。

最佳答案

时间将由磁盘 I/O 主导,因此您使用哪种 API 不如考虑磁盘如何工作重要。如果您随机访问磁盘(旋转媒体),将花费 3 到 9 毫秒来寻找...一旦磁盘流式传输,它可以维持大约 128 MB/秒,这就是从磁盘磁头上掉下来的速度。 SATA 链路或 PCIe 总线的带宽远高于此(600 至 2000 MB/秒)。 Linux 在内存中有一个页面缓存,它在磁盘上保存页面的拷贝,因此只要您的机器有足够的 RAM,后续尝试就会很快,即使您随后随机访问数据也是如此。所以建议一次读取大块。如果您真的想加快初始加载速度,那么您可以使用 mmap 映射整个文件 (1GB-4GB),并使用辅助线程按顺序读取每个页面的第一个字节。

您可以阅读更多关于 disk drive performance characteristics here. 的信息

您可以阅读有关 page cache here. 的更多信息

关于c++ - 在 C++ 中,将大型二进制 (1GB-4GB) 文件加载到内存中的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14822151/

相关文章:

c++ - 运算符++ : reference vs value return and unused argument

linux - Bash打印特定字符串的第N个单词存在

mysql - mysql 查询的正则表达式匹配 html 实体

c - 写入返回值 c

c - 我应该如何在 c 中存储从 getline() 获得的第一行?

c++ - 如何在 QT 中通过 C++ 监控 Linux 中的服务?

c++ - 可以在运行时优化浮点零乘法吗?

c++ - C++中的websocket fin位

linux - 如何在不同的 Linux 帐户之间复制并粘贴整个文件?

linux - 如何为我的存储库删除所有 Git 痕迹?