c++ - 使用哪种类型的文件访问?

标签 c++ windows io

我正在构建一个仅适用于 Windows 的自定义文件格式的 io 框架。这些文件的大小在 100MB 到 100GB 之间。读/写以几百 KB 到几 MB 的顺序出现在不可预测的位置。读取速度是最关键的,不过,cpu 的使用可能胜过它,因为我听说 fstream 在使用 SSD 时可以真正削弱它。

最初我打算使用 fstream,但随着我对文件 IO 的深入了解,我发现了很多其他选项。由于我对这个主题没有什么经验,所以我对使用哪种方法感到困惑。我列出的选项是 fstream、FILE 和映射文件。

到目前为止,在我的研究中,我发现的是很多相互矛盾的基准测试结果,这些结果取决于 block 大小、缓冲区大小和其他我不了解的瓶颈。如果有人能阐明这些选项之间的优点/缺点,那将会很有帮助。

最佳答案

在这种情况下,瓶颈主要是您的硬件而不是您使用的库,因为您正在读取的 block 相对较大 200KB - 5MB(与扇区大小相比)并且是连续的(全部合二为一)。 对于硬盘(高寻道时间),读取比优化缓存所需的更多数据可能有意义。对于 SSD,我不会使用大缓冲区,而是只读取确切需要的数据,因为寻道时间不是大问题。

内存映射文件便于完全随机访问您的数据,尤其是小块(甚至几个字节)。但是设置内存映射文件需要更多代码。在 64 位系统上,您可以(虚拟地)映射整个文件,然后让操作系统缓存系统优化读取(对同一数据的多次访问)。然后您可以只返回指向所需内存位置的指针,甚至不需要临时缓冲区或使用 memcpy。这将非常简单。

与 FILE 相比,fstream 为您提供了额外的功能,我认为这在您的情况下用处不大。

关于c++ - 使用哪种类型的文件访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22315456/

相关文章:

windows - 在 Windows 上使用 gcc 进行构建时出错

file - 输出到 lisp 中的文本文件

java - 强制的?在 MySql 中为存储过程使用不同的定界符

c++ - cppcheck 中的 SLOC

c++ - 模板多态性不起作用?

windows - Powershell参数错误 'p'

c++ - 是什么导致 WS_TABSTOP 影响窗口绘制顺序?

performance - SQL Server 2008 大表性能

c++ - 分支预测 : Writing Code to Understand it; Getting Weird Results

java - 默认情况下,Java 和 C++ 中的类是私有(private)的还是公有的?