【问题标题】:Does boost support circular files?boost是否支持循环文件?
【发布时间】:2011-07-08 12:00:51
【问题描述】:

我需要使用循环文件在磁盘上保存大量动态数据(一次写入,可能永远不会读取)。

为了更清楚,我想将文件视为循环缓冲区 - 即写入缓冲区将转到文件,读取将是文件读取。具体来说,我正在做日志。

我想知道 boost 是否有任何我可以使用的功能(最好是循环文件)。

我看到 boost 中有一个循环缓冲区,但我不能将它与文件一起用作某种后端。我什至考虑过mmap()-将文件放入内存(如果我使用大小超过 4GB 的日志,这将不是一个好的解决方案),然后从我将传递给的Allocator 返回映射块缓冲区。
这似乎是一种不好的方法,因为循环缓冲区文档说Allocator 将用于任何内存分配(而不仅仅是缓冲区分配)。

循环文件是否有其他功能,或者有其他方法可以做到这一点?

嗯,我实际上是指在文件系统日志的意义上记录(即记录写入)。我有一个要记录的磁盘(对它的写入),以便我可以执行 CDP。我需要记录所有写入和标记,以便我可以将磁盘回滚到之前的位置。
日志可能有很多空间(很容易超过 10GB),所以我不知道 mmap 解决方案是否有效。

【问题讨论】:

  • 如果日志条目是固定长度的,那么是随机访问文件? r+ 模式 - fseek?

标签: c++ linux file logging boost


【解决方案1】:

使用Boost的Circular Buffer + Boost IPC的内存映射文件怎么样? IPC 文档说这是可能的:http://www.boost.org/doc/libs/1_46_0/doc/html/interprocess/allocators_containers.html(见最后一行)。

【讨论】:

  • 谢谢!我不确定它是如何工作的,但我认为我需要映射我想要的所有内存。假设 boost 使用通常的 mmap 语义(映射虚拟内存),映射超过 100 兆字节将是非常浪费的。由于我在谈论磁盘日志记录,用户可以轻松地要求 5GB 日志(例如 win 系统还原是磁盘大小的 10%),所以我不确定这是否适合我。
【解决方案2】:

您将问题标记为 Linux,并且正在编写日志文件,因此请为您的应用程序配置 logrotate。它足够灵活,可以随心所欲。

【讨论】:

    【解决方案3】:

    RRDtool 可以接受吗?它是用 C 语言而不是 C++ 编写的,但希望围绕 API 构建一个面向对象的 shim 不会太糟糕。

    【讨论】:

    • 谢谢,我确定它是一个很好的库,但我已经开始使用 boost,我不想使用另一个库(可能需要时间来掌握它,并且在使用该应用程序时还意味着要安装另一件事)。我相信自己编写比实际使用库更容易。
    • @TomM,完全理解。 :) 但是大多数发行版已经附带了 RRDTool,所以它只是在你的 Packages.gz 文件和 foo.spec 文件中添加了一个依赖行。
    • 其实这是一件很棒的事情,它让我重新考虑。但是在查看了 RRDtool 网站后,我认为会有一段重要的学习期,我不想支付:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2016-08-02
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多