c++ - 处理记录最后 1000 个事件的文件操作的最佳方法

标签 c++ algorithm file

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

下面提到的两种解决方案,哪一种更好?或者有其他选项可以加快日志记录速度吗?

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

最佳答案

这里有几个考虑因素,不能同时优化。其中包括:

  1. 发出日志消息的进程的延迟和吞吐量

  2. IO操作总数

  3. 读取日志消息的延迟

可能没有“最好的方法”。您需要找到适合您要求的工作点。


例如,Nathan Oliver 在评论中基本上建议让发射进程写入某些 aux文件,一旦满了就将其重命名为 auxlog

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

因此,这个想法在某些情况下可能非常好,但在其他情况下可能会被认为不够充分。


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

同时,后台进程可以定期扫描 tmp目录。当它看到这些文件时,它应该显示:

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

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

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

这对于发射器和读取器来说都有合理的延迟,但总 IO 访问次数较多。 YMMV。

关于c++ - 处理记录最后 1000 个事件的文件操作的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39833312/

相关文章:

c++ - 要将嵌套类中定义的静态模板函数声明为兄弟嵌套类中的友元,必须做什么?

C++11 用于在没有样板索引的情况下循环部分填充的数组?

php - $_FILES ["file"] ["type"] 和 end(explode (".", $_FILES ["file"] ["name"])) 有什么区别

javascript - Firefox 中的 HTML 5 拖放无法按预期工作

java - 如何检查 Java 中动态创建的文件?

c++一次检查所有数组值

c++ - 使用多个键(例如参数对/元组)访问 boost 多索引容器上下文

algorithm - 使用什么算法来格式化 EDIFACT 文件?

c++ - 一组线性点的高效最长算术级数

algorithm - 云中虚拟机 (VM) 整合的高效算法