磁盘IO循环文件写入问题
Disk IO Issue with circular file writes
在我的软件中,我有4x 500GB的文件,我使用boost内存映射文件api以循环方式顺序写入。
我在32MB块中分配区域,当在末尾分配块时,我创建了两个内存映射区域,其中第一个是文件的末尾,第二个是文件的开头,并映射到第一个区域的结束地址。
现在这对于较小的文件工作得很好。然而,对于大文件,当到达结束区域时,磁盘性能会降到最低,我不确定如何避免它。
我猜正在发生的事情是磁盘试图写入文件的两端,并且主轴必须来回跳跃。这是一件相当愚蠢的事情,特别是在进行顺序写入时,我希望操作系统能更聪明一点。
有没有人有什么办法可以避免这个问题?
我正在考虑升级到Windows 10,希望它能做得更好。但这是一个相当冒险的改变,我现在想避免。
我还应该注意到,这些文件存在一个软件RAID 1上,带有2个3TB希捷安装企业驱动器。这些驱动器的最小顺序写入速度为60MB/s,平均为120MB/s,我以30mb/s的速度写入所有文件。
代码可以在这里找到。
编辑:所以事实证明,在写入整个文件之后,然后从头开始,操作系统实际上开始读取磁盘上的内容,即使它不需要,我认为这是导致问题的原因。
"这些驱动器的最小顺序写入速度为60MB/s" -这无关紧要,因为您没有进行顺序写入。
使用SSD缓存,或者重新考虑设计(找到一种方法来防止跨缓冲区的访问)
与速度无关:你可以使用直接映射到文件的循环缓冲区,这样你就不必使用(专有的?)技巧来映射"连续"的地址区域。粗略的想法:boost::circular_buffer相当于文件?
相关文章:
- 使用mongocxx驱动程序时包含头文件问题
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 编译要在英特尔Hyperscan中使用的.cc文件时出现问题
- 使用 seekg() 读取C++中的文件时出现问题
- sqlite3 和生成文件中的链接出现问题
- C++头文件和类实现出现问题
- 用户输入字符串的文件附加问题..C++
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 读取文件并将其存储在unordered_map中时出现问题
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 我在使用C++文件时遇到了一些问题
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 将文件复制到自定义位置,存在字符串转换问题
- DirectX12 的问题:"d3dApp.h":没有这样的文件或目录
- (ODR 使用问题)在不同文件中priority_queue名称相同的结构
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 读取制表符分隔的文件时出现问题 C++
- 当我在 CLion 中读取数组中的 txt 文件时C++编码问题
- 使用 RapidXML 解析大型 XML(大小大于 65 KB)文件时出现问题
- C++:读取.BMP文件时出现问题;文件结束时间早于预期