我的脚本中有一段会创建一个文件列表来扫描关键词。
问题是,日志文件总共约为11GB。当我在shell中使用grep
来搜索它们时,大约需要4到5分钟。当我使用我的python脚本执行此操作时,它只是将服务器挂起到我需要重新启动它的程度。
它似乎是正确的,它会导致整个服务器崩溃,但实际上我不需要它来滚动所有文件,只是那些在上周被修改的文件。
到目前为止我已经知道了这一点:
logs = [log for log in glob('/var/opt/cray/log/p0-current/*') if not os.path.isdir(log)]
我假设我需要在此之前添加一些内容来初步过滤掉错误的文件?
我以这种格式玩os.path.getmtime
:
logs = [log for log in glob('/var/opt/cray/log/p0-current/*') if not os.path.isdir(log)]
for log in logs:
mtime = os.path.getmtime(log)
if mtime < "604800":
do-stuff (create a new list? Or update logs?)
这就是我现在所处的位置,但它不起作用,但我希望我能用内联列表做更优雅的事情?
答案 0 :(得分:3)
根据文件名的数量和内存的少(512MB VPS?),您可能会耗尽内存,创建两个所有文件名列表(一个来自glob
和一个从你的列表理解。)不一定是这种情况,但我必须继续。
尝试切换到iglob
(使用os.scandir
并返回迭代器)并使用生成器表达式,看看是否有帮助。
此外,getmtime
获得时间,而不是从现在开始的时间间隔。
import os
import glob
import time
week_ago = time.time() - 7 * 24 * 60 * 60
log_files = (
x for x in glob.iglob('/var/opt/cray/log/p0-current/*')
if not os.path.isdir(x)
and os.path.getmtime(x) > week_ago
)
for filename in log_files:
pass # do something