我应该调用 fopen - fclose 每个 fwrite 操作吗
Should I call fopen - fclose every fwrite action
我正在数据库系统中制作类似于 commit log
的东西。该系统能够处理约 20,000 个事件/秒。每个事件占用约 16 个字节。粗略地说,系统将以约 312.5 kB / 秒的速度写入 commit log
。每个 commit log
文件最多包含 500,000 个事件。
我有一个问题:我应该为每个事件调用 fopen - fwrite - fclose
,还是应该在创建新文件时调用一次 fopen
,然后是一系列的 fwrite
,最后fclose
?
fopen/fwrite/fclose 每秒 20k 次看起来相当昂贵。
考虑调用 fflush 作为替代方法。
如果您希望使用它来记录数据库事务以进行可能的恢复,您可能需要重新考虑它。 f 系列函数使用缓冲,因此在发生崩溃时,最终缓冲区可能已实际写入磁盘,也可能未写入磁盘。
你没有义务,不......事实上,按照 的建议调用 fflush
会更好。
然而,更好的是,如果你能避免调用 fflush
那将是理想的,因为 C 标准库可能(可能会)实现系统特定的缓存以将较小的物理写入合并为较大的物理写入,使得您每秒 20k 的写入速度更佳。
按照您的建议调用 fopen
/fwrite
/fclose
,或者按照 EvilTeach 的建议调用 fflush
会避开缓存,这可能会降低性能。
在这种情况下,恢复到 open/write/close 并完全摆脱 C 缓冲输出可能会更好。日志文件通常由大量几乎相同(大小方面)的写入组成,并没有真正从 C 缓冲中获益太多。低级别、无缓冲 I/O 也可以减轻您调用 fflush() 的负担,并且可以保证将每个日志条目写入原子实体。
鉴于您提到的卷,您应该仍然不关闭并在写入之间重新打开文件。
我正在数据库系统中制作类似于 commit log
的东西。该系统能够处理约 20,000 个事件/秒。每个事件占用约 16 个字节。粗略地说,系统将以约 312.5 kB / 秒的速度写入 commit log
。每个 commit log
文件最多包含 500,000 个事件。
我有一个问题:我应该为每个事件调用 fopen - fwrite - fclose
,还是应该在创建新文件时调用一次 fopen
,然后是一系列的 fwrite
,最后fclose
?
fopen/fwrite/fclose 每秒 20k 次看起来相当昂贵。 考虑调用 fflush 作为替代方法。
如果您希望使用它来记录数据库事务以进行可能的恢复,您可能需要重新考虑它。 f 系列函数使用缓冲,因此在发生崩溃时,最终缓冲区可能已实际写入磁盘,也可能未写入磁盘。
你没有义务,不......事实上,按照 fflush
会更好。
然而,更好的是,如果你能避免调用 fflush
那将是理想的,因为 C 标准库可能(可能会)实现系统特定的缓存以将较小的物理写入合并为较大的物理写入,使得您每秒 20k 的写入速度更佳。
按照您的建议调用 fopen
/fwrite
/fclose
,或者按照 EvilTeach 的建议调用 fflush
会避开缓存,这可能会降低性能。
在这种情况下,恢复到 open/write/close 并完全摆脱 C 缓冲输出可能会更好。日志文件通常由大量几乎相同(大小方面)的写入组成,并没有真正从 C 缓冲中获益太多。低级别、无缓冲 I/O 也可以减轻您调用 fflush() 的负担,并且可以保证将每个日志条目写入原子实体。
鉴于您提到的卷,您应该仍然不关闭并在写入之间重新打开文件。