我遇到过一种情况,我必须记录队列中存在的最后 1000 个事件。 通过减少昂贵的文件操作来处理此问题的最佳解决方案是什么? 目前我们正在用所有队列条目完全重写该文件。
下面提到的两种解决方案,哪一种更好?或者有其他选项可以加快日志记录速度吗?
- 设置固定的日志消息大小并使用文件指针进行读/写操作。
- 创建多个文件,当请求到来时,从最后一个文件中读取 1000 个事件
最佳答案
这里有几个考虑因素,不能同时优化。其中包括:
发出日志消息的进程的延迟和吞吐量
IO操作总数
读取日志消息的延迟
可能没有“最好的方法”。您需要找到适合您要求的工作点。
例如,Nathan Oliver 在评论中基本上建议让发射进程写入某些 aux
文件,一旦满了就将其重命名为 aux
至log
。
这个想法对于发射器来说具有非常低的延迟特性,并且 IO 操作总数基本上是最佳的。相反,(至少取决于实现)它对读者来说有无限的延迟。假设记录器发出 1700 条消息,然后无限期停止记录。日志读取器访问最后 700 条消息所需的时间没有限制。
因此,这个想法在某些情况下可能非常好,但在其他情况下可能会被认为不够充分。
另一种方法(使用不同的工作点)是让发出消息的进程再次写入某些 aux
。当 aux
消息数量超过一定数量(可能小于1000),或者已经过去一定时间,则应该重命名aux
到 temp
中的某个临时命名文件目录。
同时,后台进程可以定期扫描 tmp
目录。当它看到这些文件时,它应该显示:
log
文件(这是外部查看的唯一文件)在
tmp
中找到的文件按修改时间排序
它应该保留最后 1000 条消息(最多),将它们写入一些 tmp_log
文件,将其重命名为log
,然后删除它在 tmp
中读取的文件。
这对于发射器和读取器来说都有合理的延迟,但总 IO 访问次数较多。 YMMV。
关于c++ - 处理记录最后 1000 个事件的文件操作的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39833312/