【发布时间】:2011-08-15 06:29:54
【问题描述】:
我正在用 C++ 编写一个程序,想知道是否有人可以帮助我解决这里解释的情况。
假设,我有一个大小约为 30MB 的日志文件,我已将最后 2MB 的文件复制到程序内的缓冲区中。
我删除文件(或清除内容),然后将我的 2MB 写回文件。
到这里为止一切正常。但是,问题是我读取文件(最后 2MB)并清除文件(30MB 文件),然后写回最后 2MB。 如果在我从 1GB 文件复制最后 300MB 文件的情况下,将需要很多时间。
有没有人想过让这个过程更简单?
当日志文件较大时,应该并且将考虑以下原因。
磁盘空间:日志文件是未压缩的纯文本,会占用大量空间。 典型的压缩将文件大小减少 10:1。但是无法压缩文件 使用时(锁定)。所以日志文件必须轮换使用。
系统资源:定期打开和关闭文件会消耗大量系统资源 资源,它会降低服务器的性能。
文件大小:小文件更容易在发生故障时备份和恢复。
我只是不想将最后的特定行复制、清除和重新写入文件。只是一个更简单的过程.... :-)
编辑:不进行任何内部流程来支持日志轮换。 logrotate 是工具。
【问题讨论】:
-
附带说明,如果这是您的程序要做的所有事情,如果您在 *nix 系统上,则可以使用简单的 *nix 命令执行此操作。
dd可以将所需的块复制到辅助文件中,然后从那里进行删除重命名... -
@Thanatos 作为旁注,有几个 GNU 实用程序到 Windows 的端口。
-
例如,
tail --bytes=2MB file_name | xargs -0 echo > file_name
标签: c++ file file-io logging filestream