pythonアルゴリズムの集計アルゴリズム-readlinesファイルではなくreadlinesを使用して集計
質問:
最近会社のあるシステムのログを処理していますが、ログファイルが多すぎて、しかも量が多い(du-shを使って数百Gあることを確認しました)ので、直接一度にすべてのログデータを処理するとサーバーの負荷が高くなり、メモリがほとんど食べられてしまい、プロセスは管理者killによく
処理方法:
ファイルを1日単位で処理し、現在のファイルと前日のファイルを統合する方法で、プログラムの効率性を大幅に向上させ、メモリの消費量を削減します.関連するキーコードはファイルのマージです.集計アルゴリズムを使用してファイルをマージします.
実現構想:
1、まずログから必要なデータを抽出し、並べ替えてファイルに出力します.集計アルゴリズムは2つの並べ替えられたデータ接合を処理しているからです.
2.次に、現在の日のログと前日のログをマージします.file_oldは前日のマージ後のログデータファイル、file_を表します.todayは、抽出された前日のログデータファイル、file_を表します.mergeは、マージ後の現在のログデータファイル、すなわち、当日のログファイルと前日のマージ後のログファイルをマージしてfile_に出力するmergeは次の反復の入力として使用されます.
3、集計(Merge)ソート法は、2つ(または2つ以上)のソートテーブルを新しいソートテーブルにマージすることである.すなわち、ソートされるシーケンスをいくつかのソートされたサブシーケンスに分け、ソートされたサブシーケンスを全体のソートシーケンスにマージする.
主なステップ:a、2つのポインタx,y、それぞれ2つの並べ替えられたシーケンスの先頭を指す
b、2つのポインタが指す要素x,yを比較し、比較的小さい要素を選択してマージ空間に入れ、ポインタを次の位置に移動する
c、あるポインタがシーケンスの最後を超えるまで手順3を繰り返す
d、他のシーケンスの残りのすべての要素を連結シーケンスの最後に直接コピーする
次のコードは、抽出されたデータがスペースで区切られていると仮定し、各行の最初のデータがキーワードkeyであり、ソートとして使用され、キーワードが同じであれば、ビジネスロジックに基づいてこの行をマージします.20行目のmergeLine(old,today)はkeyが同じときにビジネスロジックに基づいてデータを処理する方法で、自分のニーズに合わせて書くことができます.
ファイル集計アルゴリズムコード:
ここではreadlineを用いてファイルを行ごとに読み取り、1行1行処理することで、メモリの消費量が低くなります.
毎日のログデータファイルは小さいものも1 G、大きいものも4、5 Gなので、readlines()をそのまま使ってすべてのファイルを読み込むとメモリがたくさん食べられます.
linecacheも使用できます.getlinesはファイルをキャッシュに読み込み、linecacheを使用します.getline(i)は、指定された行を読み出す.
最近会社のあるシステムのログを処理していますが、ログファイルが多すぎて、しかも量が多い(du-shを使って数百Gあることを確認しました)ので、直接一度にすべてのログデータを処理するとサーバーの負荷が高くなり、メモリがほとんど食べられてしまい、プロセスは管理者killによく
処理方法:
ファイルを1日単位で処理し、現在のファイルと前日のファイルを統合する方法で、プログラムの効率性を大幅に向上させ、メモリの消費量を削減します.関連するキーコードはファイルのマージです.集計アルゴリズムを使用してファイルをマージします.
実現構想:
1、まずログから必要なデータを抽出し、並べ替えてファイルに出力します.集計アルゴリズムは2つの並べ替えられたデータ接合を処理しているからです.
2.次に、現在の日のログと前日のログをマージします.file_oldは前日のマージ後のログデータファイル、file_を表します.todayは、抽出された前日のログデータファイル、file_を表します.mergeは、マージ後の現在のログデータファイル、すなわち、当日のログファイルと前日のマージ後のログファイルをマージしてfile_に出力するmergeは次の反復の入力として使用されます.
3、集計(Merge)ソート法は、2つ(または2つ以上)のソートテーブルを新しいソートテーブルにマージすることである.すなわち、ソートされるシーケンスをいくつかのソートされたサブシーケンスに分け、ソートされたサブシーケンスを全体のソートシーケンスにマージする.
主なステップ:a、2つのポインタx,y、それぞれ2つの並べ替えられたシーケンスの先頭を指す
b、2つのポインタが指す要素x,yを比較し、比較的小さい要素を選択してマージ空間に入れ、ポインタを次の位置に移動する
c、あるポインタがシーケンスの最後を超えるまで手順3を繰り返す
d、他のシーケンスの残りのすべての要素を連結シーケンスの最後に直接コピーする
次のコードは、抽出されたデータがスペースで区切られていると仮定し、各行の最初のデータがキーワードkeyであり、ソートとして使用され、キーワードが同じであれば、ビジネスロジックに基づいてこの行をマージします.20行目のmergeLine(old,today)はkeyが同じときにビジネスロジックに基づいてデータを処理する方法で、自分のニーズに合わせて書くことができます.
ファイル集計アルゴリズムコード:
def mergeFile(file_old,file_today,file_merge):
fp_old = open(file_old,"r")
fp_today = open(file_today,"r")
fp_merge = open(file_merge,"w")
old_line = fp_old.readline()
today_line = fp_today.readline()
while old_line and today_line:
old = old_line.strip().split()
today = today_line.strip().split()
if old[0] < today[0]:
fp_merge.write(old_line)
old_line = fp_old.readline()
elif old[0] > today[0]:
fp_merge.write(today_line)
today_line = fp_today.readline()
else:
megre_line = mergeLine(old,today)
fp_merge.write(megre_line)
old_line = fp_old.readline()
today_line = fp_today.readline()
continue
if old_line:
fp_merge.write(old_line)
for line in fp_old:
fp_merge.write(line)
if today_line:
fp_merge.write(today_line)
for line in fp_today:
fp_merge.write(line)
fp_merge.close()
fp_old.close()
fp_today.close()
ここではreadlineを用いてファイルを行ごとに読み取り、1行1行処理することで、メモリの消費量が低くなります.
毎日のログデータファイルは小さいものも1 G、大きいものも4、5 Gなので、readlines()をそのまま使ってすべてのファイルを読み込むとメモリがたくさん食べられます.
linecacheも使用できます.getlinesはファイルをキャッシュに読み込み、linecacheを使用します.getline(i)は、指定された行を読み出す.