【问题标题】:Calling fallocate() on a C++ ofstream在 C++ ofstream 上调用 fallocate()
【发布时间】:2013-06-19 12:35:47
【问题描述】:

我正在通过 ofstream::write() 写入一个大的二进制输出缓冲区。由于我知道输出文件的大小,但有时必须以块的形式写入,我认为最好先调用 fallocate()(或 posix_fallocate())在磁盘上预分配缓冲区。但是,这些确实需要一个文件描述符,而 ofstream 没有提供给我。

是否有用于调用 fallocate() 的 ofstream 接口,或者可能获取底层文件描述符以便我自己调用它? (或者不值得费心?)

【问题讨论】:

  • fallocate 是,AFAICT,并不意味着作为性能优化,而是作为确保在开始写入之前有足够的磁盘空间可用的一种手段。这是你想做的吗?
  • 出于性能原因,我正在考虑使用它,因为我将经常(每秒多次)编写此类文件,并希望通过预先提供最终文件大小来优化文件系统访问.
  • 如果你想要性能(并且你知道文件的大小),那么我会使用内存映射文件。关于“如何充分利用文件系统”已经进行了多次讨论,每次的结论都是使用内存映射文件 - 主要原因是这与将数据加载到进程中的效率差不多,并且操作系统可以优化块大小等以与其进入的内存很好地对齐,而不是经常读取太小或太大块等的传统文件接口。

标签: c++ ofstream


【解决方案1】:

由于您要分块写入,请使用 fwrite 另请参阅http://www.cplusplus.com/reference/cstdio/setvbuf/ 以控制缓冲区大小 优化你可以有缓冲区大小 = N * 块大小

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多