一覧

2017-02-19 6 views
1

..一覧

問題があり、ログファイルを一括して11ギガバイトの周りにあります。シェルで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

「man find」を使いたい場合は、それ以外の場合、[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例を作成してみてください。そうすれば、私たちがあなたを助けやすくなります。 –

+0

Pythonでは 'find()'が何かを知りませんでした。勉強中です。私は自分の要件についての私の説明が最小、完全、そして検証可能であると思った。私のリストを構築する条件にさらにトリミングを加えることを望む。だから、現在のリスト 'logs'には膨大な数のファイル名が含まれていますが、604800秒(1週間)未満の修正された時間を持つファイルを整理したいのですが、 os.path.getmtime(log) 'を実行して結果を表示すると、大きな数字が得られます。私は 'os.path.getmtime()'を検索し、結果が秒単位であることを発見しました – jonnybinthemix

+0

@StephenRauch - 通常のシェルと同様のものを使用できますか? 'find/path/to/logs -type f -mtime -7' - これははるかにクリーンです。 2週間で私はPythonを学んできました。すべては普通のシェルスクリプトよりずっと長いです。私はそれが私の理解の欠如であると確信していますが、私は現在、Bashに比べてPythonの利点を見つけるのに苦労しています。 – jonnybinthemix

答えて

3

ファイル名の数とメモリの使用量(512MB VPS?)によっては、メモリが不足していて、すべてのファイル名のリストが2つ作成されている可能性があります(globから1つ、リストの理解から1つ)。大したことはありません。

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はいつか、ずっと前に、だから> –