2017-02-19 106 views
1
1周

我有我的剧本的部分,这将创建一个文件列表,通过扫描的关键词中..列表修改

的问题是,日志文件统称周围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

如果你想优雅的使用'男人find'。否则,请尝试创建[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例。这使我们更容易帮助你。 –

+0

不确定你的意思,我不知道'find()'是Python中的一件事。我在学。我认为我对我的要求的解释是最小的,完整的和可验证的。希望添加进一步的修剪到建立我的列表的条件。所以目前'log'列表包含了大量的文件名,但是我想把它修改为修改时间少于604800秒(1周)的文件,我把它放在几秒钟内,因为当我使用' os.path.getmtime(log)'然后打印结果,我得到一些巨大的数字。我查找了'os.path.getmtime()',发现结果以秒为单位 – jonnybinthemix

+0

@StephenRauch - 我可以使用类似于常规shell的东西吗? 'find/path/to/logs -type f -mtime -7' - 这会更干净。在2周内我一直在学习Python ..所有事情似乎都比普通的shell脚本长得多。我相信这是我的缺乏理解,但我现在努力寻找Python比Bash的好处。 – jonnybinthemix

回答

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 
+0

感谢您的帮助,我会尽快发挥您的建议。另外,我查了一下,它确实耗尽了内存。 – jonnybinthemix

+0

这个效果非常好!我在'find/var/opt/cray/log/p0-current -mtime -7 -maxdepth 1'旁边进行了测试,并且上面的回应是相同的列表,所以它运行良好。我没有得到'和os.path.getmtime(x)> week_ago'在我的脑海里,这是说mtime大于1周?或者我错过了什么? – jonnybinthemix

+0

这里是mtime,不是多久以前,所以>是 –