【问题标题】:Efficient way to exchange file contents交换文件内容的有效方法
【发布时间】:2016-06-27 18:54:02
【问题描述】:

我有 N 个文件。文件 0,文件 1...文件(n-1)。我的程序总是在这些文件上生成日志。我总是写到 File0。如果 File0 超过预定义的大小,则 File1 将其内容传递给 File2,并将 File2 传递给 File3...传递给 File(n-1),然后 File0 将其内容传递给 File1。所以基本上日志是按从 File0 到 File(n-1) 的修改日期排序的。我的问题是如何有效地传递这些文件内容。每个文件大小可能为 100MB。所以我不能深度复制它们。

我的方法

我将销毁文件(n-1)。然后将文件(n-2)重命名为文件(n-1)并将文件(n-3)重命名为文件(n-2),依此类推,将文件0重命名为文件1。然后我将再次创建 File0 并在上面写。

我的问题是我可以以某种方式交换文件指针或 fds,以便不需要重命名和销毁的所有这些复杂性吗?或者有没有其他更简单/有效的交换方式。

【问题讨论】:

  • 为什么要这样做? fileN 不能是最新的日志并且 fileN-1 不能在历史记录中返回到 file0 吗?这更容易实现,并且节省了大量的复制/重命名/改组。
  • 为什么?你填充file0,然后你移动到file1。一旦你填写你移动到file2。当您填写日志文件时,您只会继续上升。这使得 0 是最旧的,而 N 是当前的。
  • 如果你坚持你的技术,那么你就会陷入一堆重命名操作。如果您创建新文件,因此文件 0 是最旧的,文件 N 是最新的,那么您无需重命名。我会避免重命名。
  • 您不需要删除最后一个日志文件,只需将其截断并重命名,同时重命名所有其他文件。然后重命名为file0
  • 以上评论中的许多人似乎没有正确阅读您的问题。您的重命名解决方案似乎很好;我认为没有理由改变它。它本质上就是 logrotate 所做的。

标签: c++ c file file-descriptor


【解决方案1】:

我的问题是我可以以某种方式交换文件指针或 fds,以便不需要重命名和销毁的所有这些复杂性吗?或者有没有其他更简单/有效的交换方式。

简短的回答(尽管不包括在内)是:不,这不会有效。

更长的答案是:取决于你想要什么。

  • 您希望 file0 始终保持满状态并“溢出”到 file1 中吗?

    如果是这种情况,那么您需要保持所有文件打开,保持文件描述符静态以便控制溢出,可能实现递归日志write 函数(恕我直言......不好玩)。

    如果这是您的意图,那么是的,您绝对可以同时处理文件描述符,但无论何时写入日志文件都会对性能造成严重影响。

  • 您是否希望 file0 填满后“变成”file1,例如将数据推送到 LIFO 文件堆栈,以便从一个空的 file0 重新开始?

    如果是这种情况,由于数据不会在文件之间“流动”,因此保持所有文件打开并浪费系统资源是没有意义的。您只会在发生轮换时处理文件。

    您可能还需要实现一个自定义的write 函数来锁定和同步写入操作,因此在文件轮换生效时不会发生竞争条件。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多