Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制Python输出文件大小_Python_Linux_Sed - Fatal编程技术网

限制Python输出文件大小

限制Python输出文件大小,python,linux,sed,Python,Linux,Sed,我有一个在Debian上运行的Python程序,它使用文件对象输出数据。我想对文件的大小设置一个限制,但我不想停止编写文件——我只想删除最旧的一行(在文件顶部)。当数据包从客户端到达时,我的数据被随机写入(想想web日志记录) 我知道它可以工作,但是如果我的文件超过了限制,那么使用File.tell()的组合,然后执行下面的系统命令,这是否符合我的最佳利益 sed -i '1 d' filename 一旦达到大小限制,它将每次执行sed。有更好的方法吗?您似乎不知道logrotate。您正在

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

我知道它可以工作,但是如果我的文件超过了限制,那么使用File.tell()的组合,然后执行下面的系统命令,这是否符合我的最佳利益

sed -i '1 d' filename 

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

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


Python的日志模块之所以不使用此策略,是因为它会带来性能损失。如果根据大小或年龄旋转的日志文件是不可接受的,那么在我看来,您有两个基本选择:原地覆盖日志文件,然后写入临时文件,然后替换

如果就地覆盖日志文件,您将首先选择文件中的整数地址(第一个字节的位置加上一个字节),该地址将成为“新零”(称为X)。然后选择块大小,可能是32K。然后开始计数。搜索到X+块大小*块编号,读取一个块。查找块大小*块编号,将块写回。读取时达到EOF时,将文件截断为长度块大小*块编号

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


接下来,写入新数据并关闭文件。必须对每个日志消息执行整个过程。祝你好运

您应该签出,更具体地说,签出类。这允许您写入具有固定大小的文件。但是,它不允许在多行上操作。

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

通常的策略是在当前文件太大时开始写入新文件。然后,可以删除超过阈值的文件。这就是其他人提到的“日志循环”


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

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