记录最近1000个事件的文件操作的最佳方法

时间:2016-10-03 13:51:21

标签: c++ algorithm file

我遇到了一种情况,我必须记录队列中存在的最后1000个事件。 通过减少昂贵的文件操作来处理这个问题的最佳解决方案是什么? 目前,我们完全用所有队列条目重写文件。

在下面提到的两个解决方案中,哪个好?或者还有其他选择来加快记录速度吗?

  1. 制作固定的日志消息大小并使用文件指针进行读/写操作。
  2. 创建多个文件,当请求到来时,从上一个文件中读取1000个事件

1 个答案:

答案 0 :(得分:2)

这里有几个注意事项,不能同时进行优化。其中包括:

  1. 发出记录消息的进程的延迟和吞吐量

  2. IO操作总数

  3. 阅读日志消息的延迟

  4. 可能没有“最佳方式”。您需要找到一个适合您要求的工作点。

    例如,Nathan Oliver在评论中基本上建议将发布过程写入某个aux文件,并且一旦完整将其重命名为auxlog

    这种想法对于发射器具有非常低的延迟特性,并且具有基本上最佳的IO操作总数。相反,(至少取决于实现),它对读者来说具有无限的延迟。假设记录器发出1700条消息,然后无限期地停止记录。日志阅读器访问最后700条消息的时间没有限制。

    所以,这个想法在某些设置中可能会很出色,但在其他设置中,它可能被认为不够充分。

    另一种方法(使用不同的工作点)是让发出消息的进程再次写入某些aux。如果aux的消息数超过某个数字(可能小于1000),或者已经过了一定的时间,则应将aux重命名为{{1}中的某个临时命名文件1}}目录。

    同时,后台进程可以定期扫描temp目录。当它看到文件时,它应该是:

    • tmp文件(这是外部查看的唯一文件)

    • log中找到的按修改时间排序的文件

    它应该保留最后1000条消息(最多),将它们写入某个tmp文件,将其重命名为tmp_log,然后删除它在log中读取的文件。

    这对发射器和阅读器都有合理的延迟,但总的IO访问次数更多。 YMMV。

相关问题