gpt4 book ai didi

c - mmap vs O_DIRECT 用于随机读取(涉及哪些缓冲区?)

转载 作者:太空狗 更新时间:2023-10-29 15:26:46 26 4
gpt4 key购买 nike

我正在实现一个基于磁盘的哈希表,支持大量键(26+ 百万)。该值被反序列化。整个文件的读取基本上是随机的,值小于页面大小,我正在针对 SSD 进行优化。安全/一致性不是那么大的问题(性能很重要)。

我目前的解决方案是使用一个带有MADV_RANDOM | 的mmap() 文件。 MADV_DONTNEED 设置为禁用内核预取,仅按需加载数据。

我知道内核从磁盘读取到内存缓冲区,然后从那里反序列化。

O_DIRECT 怎么样?如果我调用 read(),我仍在复制到一个缓冲区(我从中反序列化),所以我可以获得任何优势吗?

我在哪里可以找到有关 mmap() 文件和对使用 O_DIRECT 打开的文件调用 read() 所涉及的缓冲区的更多信息>?

我对预读或缓存不感兴趣。它对我的用例没有任何帮助。

最佳答案

O_DIRECT 是读/写操作的选项,当数据绕过系统缓冲区,并直接从缓冲区复制到磁盘 Controller 时。为了获得 O_DIRECT 的优势,需要遵守一些条件 - 保持内存页面缓冲区地址对齐,缓冲区大小由 I/O block 对齐。

无论如何,如果你使用mmap,你就没有使用read/write。此外,在 mmap 之后,您可以关闭文件描述符,映射仍然有效。因此,O_DIRECT 与 mmap 选项无用。

我可以推荐什么来提高性能:

  1. 如果您的子系统有很多搜索缺失键的请求,您可以在内存中创建布隆过滤器。此后,您在布隆过滤器 http://en.wikipedia.org/wiki/Bloom_filter 上匹配您的搜索键,并在没有实际请求磁盘的情况下拒绝丢失的 key 。

  2. 为了节省内存,使用 2 级方案,当桶头保留在 mmap 内存中,但桶本身是通过 pread() 从文件中读取时。

我在自动完成子系统中实现的两个选项,您可以在这里在线查看:http://olegh.ftp.sh/autocomplete.html并估计在较慢的旧计算机 - Celeron-300 上的性能。

关于c - mmap vs O_DIRECT 用于随机读取(涉及哪些缓冲区?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19908612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com