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