【问题标题】:Limit Python Output File Size限制 Python 输出文件大小
【发布时间】:2011-09-15 20:46:39
【问题描述】:

我有一个在 Debian 上运行的 Python 程序,它使用 File 对象输出数据。我想对我的文件的大小设置一个限制,但我不想停止写入文件——我只想删除最旧的行(在文件的顶部)。当数据包从客户端到达时,我的数据是随机写入的(想想网络日志)。

我知道它可以工作,但是如果我的文件超过限制,则通过使用 File.tell() 的组合然后执行以下系统命令来实现它是否符合我的最大利益?

sed -i '1 d' filename 

一旦达到大小限制,它将每次执行 sed。有没有更好的办法?

【问题讨论】:

    标签: python linux sed


    【解决方案1】:

    除非您需要从另一个进程近乎实时地访问文件,否则我可能会将每个日志行写入固定大小的collections.deque。您可以实现一种方法,将 collections.deque 中的项目(行)按需同步到日志文件中的行。

    【讨论】:

      【解决方案2】:

      没有日志系统使用这种策略是有原因的。您无法在不重写整个文件的情况下从文件中删除第一行,因此在大文件上速度非常慢。此外,您不能在重写文件时将新数据写入文件。

      正常的策略是在当前文件变得太大时开始写入新文件。然后,您可以删除早于阈值的文件。这就是其他人提到的“日志轮换”。

      如果您真的想创建一个队列,在添加新数据时删除一行数据,我建议您改用数据库。 MongoDB 和其他数据库管理器支持数组,但如果需要,您可以对 SQL 数据库执行类似操作。

      【讨论】:

        【解决方案3】:

        您应该查看Python logging module,更具体地说,查看课程RotatingFileHandler。这允许您写入具有固定大小的文件。但是它不允许对行数进行操作。

        【讨论】:

          【解决方案4】:

          Python 的日志记录模块不使用此策略的原因是它带来的性能损失。如果无法接受根据大小或年龄轮换的日志文件,那么在我看来,您有两个基本选择:就地覆盖日志文件,然后编写一个临时文件然后替换。

          如果在原地覆盖日志文件,您将首先选择文件中的整数地址(第一个 \n 字节的位置可能加一个),它将成为“新零”(称为 X)。然后选择一个块大小,也许是 32K。然后开始数。求 X + 块大小 * 块数,读取一个块。求块大小*块号,将块写回。读取时到达EOF,将文件截断为长度块大小*块号。

          如果使用临时文件,请找到“新零”,将文件的其余部分复制到临时文件,然后将其重命名为原始名称。比上面我猜的要容易,反正更容易解释,但是占用更多的空间。

          之后,写入新数据并关闭文件。对于每条日志消息,都必须执行整个过程。祝你好运!

          【讨论】:

            【解决方案5】:

            您似乎不知道logrotate。您正在寻找类似的实现。看看这个:

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-05-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多