2017-02-19 124 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,不是多久以前,所以>是 –