2017-06-07 4 views
-2

awkスクリプトでは時間がたつにつれてメモリがますます使用されていたことがわかりました。メモリに何かを保存するはずがないので、いくつかのテストを行うことにしました。awk matchコマンドとメモリの使用

これは非常に単純なスクリプトです(私の方が大きいですが、私は非常に基本的な問題を再現しています)。私のawkスクリプトはbashスクリプト内で使用され、$file変数はawkが実行されるファイルです。私は、各行がwordを含有する大きなファイルにこのスクリプトを実行すると、私は、ファイルに印刷する場合

awk '  
{ 
    if(match($0,"word")) 
    {   
     line=substr($0, RSTART - 20, RLENGTH + 20) 
     print line 
    } 
} 
' "$file" 

は、awkスクリプトのメモリ使用量はさらに速く、超高速高めています。私はそれが私のコンピュータをフリーズする前にそれを停止しなければならない。この大きなメモリ使用量の原因は何ですか? 私の実際のスクリプトでは、ファイルは通常小さく、match関数はこの関数のようにすべての行にトリガされませんが、間違いがないことを確認することをお勧めします。

EDIT:この問題は、mawkを使用しているときには表示されないようですが、GNU awkの場合のみ、なぜそうは思われません。

+0

Input_fileに言及して "$ file"を入れたのはなぜか分かりませんか?また、サーバなどの新しいセッションを取って、バックグラウンドで何が起こっているのかを伝えるトップやvmstatなどのコマンドを実行して、メモリとCPUをチェックしてみてください。 – RavinderSingh13

+0

topでチェックし、メモリ使用量が3秒ごとに4%増えました(2GBのVM上)。ファイルに印刷すると、3秒ごとに12%増加する可能性があります。私はあなたが言及したInput_fileについて理解しておらず、スクリプトは '$ file'変数に格納されているファイルで実行されています。 – Whin3

+0

それでは、高メモリとCPUを見つけるためにコマンド(あなたが使っているものは何でも)は、このスクリプトがそれを担当していることを示していますか?あなたはメモリまたはCPUによってそれを並べ替えることができ、誰が犯人であるかを見ることができます。 また、あなたはファイルが変数から来ていると言いました、同意します。このawkを呼び出す前にどのような操作をしていますか?あなたを援助するためにもそれらを知る必要があるかもしれません。親切にも同じことの詳細をすべてお知らせください。 – RavinderSingh13

答えて

0
、...ので、はい、それはファイルサイズとexponantialで最長の出現(可能性の検査ロット)のインデックスを定義するようないくつかのより多くの計算を誘発するすべての行で、この代替

awk '  
/word/ { 
     # you can match here, if result of operation is needed for later action 
     print "hello" 
    } 
' "$file" 

試合をしよう

(と内部ラインサイズ)

一致コードを周囲から分離するcannotn conditionnal一部である場合、存在を確認以上の他の結果が目標である場合、少なくとも指数()マッチの代わりに()(以上if($0 ~ /word/)を使用)

+0

'if($ 0〜/ word /)'で動作しますが、 'RSTART'値で式の先頭のインデックスを取得するのにmatchを使用していました。私は索引がregexpで動作しないことを読んで、私は後でそれを使用するかもしれないので、私はまだ 'match'に似た解決策を探しています。 – Whin3

+0

コード/ algorythmの最適化は、目的に関するさらに詳しい情報を必要とします。マッチと関連情報で何をしたいですか? – NeronLeVelu

+0

私の例を編集して、自分が行っていることをよりよく理解しています。私は 'match'関数を使って、一致する単語の先頭をRSTART値で取得し、RSTARTとRLENGTHで行の一部を抽出します。 – Whin3

0

問題はmawkを使っている間はGNU awkだけでは表示されないようです。

私はこのように、awkスクリプトの前LC_ALL=Cを使用して問題を解決:

LC_ALL=C awk '  
{ 
    if(match($0,"word")) 
    {   
     line=substr($0, RSTART - 20, RLENGTH + 20) 
     print line 
    } 
} 
' "$file" 

はEDIT:問題は、GNUのawkの4.1.4に表示されません。これは古いバージョン(私は3.1.3)でのみ発生するようです。

+0

LC_ALLを設定すると、パフォーマンスが向上し、メモリ使用率は向上しません。それが本当であれば、この大きなバグをGNUの人々に報告して、修正できるようにする必要があります。 [email protected]で電子メールを送信し、実行しているOS、シェル、gawkのバージョンを含めてください(gawk --version | head -2)。実際には、最新のgawkバージョン(4.1.4だと思いますか?)を確認してください。問題が発生している場合は最初にフォローアップしてください。古いバージョンの場合は問題ありません。 –

+1

私のGNU Awkのバージョンは古いものでした(3.1何か)。最後の4.1.4バージョンに更新することで問題は解決しました。 – Whin3

関連する問題