繁体   English   中英

我应该打电话给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

在这种情况下,最好恢复为打开/写入/关闭状态并完全摆脱C缓冲的输出。 日志文件通常由大量几乎相同的(按大小排列)写操作组成,并且实际上不会从C缓冲中获得太多收益。 低级,无缓冲的I / O也可以减轻您调用fflush()的负担,并且可以保证将每个日志条目都写为原子实体。

给定您提到的卷,您可能应该不关闭并在两次写入之间重新打开文件。

fopen / fwrite / fclose每秒20k次看起来非常昂贵。 考虑调用fflush作为替代方法。

如果要使用它来记录数据库事务以进行可能的恢复,则可能需要重新考虑它。 f系列函数使用缓冲,因此在发生崩溃时,最终缓冲区可能实际上已经或没有真正存入磁盘。

您没有义务,不...实际上,按照EvilTeach的答案所建议的那样,将fflush称为更好的主意。

但是,更好的是,如果您可以避免调用fflush ,那将是理想的选择,因为C标准库可能(可能会)实现特定于系统的缓存,以将较小的物理写入合并为较大的物理写入,从而使每秒2万次写入更为理想。

按照您的建议调用fopen / fwrite / fclose ,或按EvilTeach的建议fflush会避免进行缓存,这可能会降低性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM