【发布时间】:2013-06-19 12:35:47
【问题描述】:
我正在通过 ofstream::write() 写入一个大的二进制输出缓冲区。由于我知道输出文件的大小,但有时必须以块的形式写入,我认为最好先调用 fallocate()(或 posix_fallocate())在磁盘上预分配缓冲区。但是,这些确实需要一个文件描述符,而 ofstream 没有提供给我。
是否有用于调用 fallocate() 的 ofstream 接口,或者可能获取底层文件描述符以便我自己调用它? (或者不值得费心?)
【问题讨论】:
-
fallocate 是,AFAICT,并不意味着作为性能优化,而是作为确保在开始写入之前有足够的磁盘空间可用的一种手段。这是你想做的吗?
-
出于性能原因,我正在考虑使用它,因为我将经常(每秒多次)编写此类文件,并希望通过预先提供最终文件大小来优化文件系统访问.
-
如果你想要性能(并且你知道文件的大小),那么我会使用内存映射文件。关于“如何充分利用文件系统”已经进行了多次讨论,每次的结论都是使用内存映射文件 - 主要原因是这与将数据加载到进程中的效率差不多,并且操作系统可以优化块大小等以与其进入的内存很好地对齐,而不是经常读取太小或太大块等的传统文件接口。