【发布时间】:2016-06-30 09:10:46
【问题描述】:
我正在数据库系统中制作类似于commit log 的东西。该系统能够处理约 20,000 个事件/秒。每个事件占用约 16 个字节。粗略地说,系统将以 ~312.5 kB / 秒的速度写入commit log。每个commit log 文件最多包含500,000 个事件。
我有一个问题:我应该为每个事件调用fopen - fwrite - fclose,还是应该在创建新文件时调用一次fopen,然后是一系列fwrite,最后是fclose?
【问题讨论】:
-
fopen, fclose非常昂贵,因此不建议每次写入。但是,为了保持崩溃一致性,您可能需要定期刷新文件。 -
@user3386109 不幸的是,没有标准的方法可以“防止您在异常终止时丢失超过 1 个事件”。例如,如果断电,则驱动控制器已缓冲但尚未写入盘片的任何数据都将丢失。没有标准方法可以强制驱动控制器将其缓冲区的内容写入盘片。
fflush不处理这个问题。fflush处理强制操作系统将未写入的数据发送到驱动器控制器。
标签: c file-io fopen file-handling fclose