grep時のメモリ不足No.29413
マボカル さん 11/01/25 16:27
 
こんにちは。マボカルです。
以下のような大量のファイル(.html)を対象にgrepをかけて
必要とする文字列が含まれたタグ部分の列のみを一つのテキスト
ファイルとして取り出そうとしています。

ファイル数:67,000
フォルダ数: 3,200
全体サイズ:1GB

検索文字列は|で区切った何パターンかのタグ部分です。

xxxx|xxxx|xxxx|xxxx|xxxx

ただ問題はタグ部分の一行の長さがとても長く、普通にgrepをかけても
2048文字目からgrep結果が切れてしまいます。解決方法として過去
スレッドを探したところ以下のようなものが出てきたので

http://www.maruo.co.jp/hidesoft/2/x27665_.html#27665

>もう1つは設定で、少々裏技的ですがgrepダイアログで「追加の条件」をONにし
>て何らかの条件を指定すると、grepは既存の方式とは違う方法で実行され、grep
>結果も2048文字を超えた実際のテキストを結果に表示させることができるように
>なる方法もあります。
>何らかの追加の条件を指定する必要がありますが、もしC言語の#ifdef等の無効部
>分を使われていないとしたら、「#ifdef等の無効部分」「を除く」にしておくと、
>ほぼ通常のgrepと変わりない動きで結果は長いものが表示されることになると思
>います。

ご指示のとおり「#ifdef等の無効部分」「を除く」で再度grepをかけると

メモリ不足です。死にます。(場所=CAddBuffer)

というダイアログが出て350,000行あたりで死んでしまいます。

フォルダを分割して2回に分けてgrepをかけてもやはりメモリ不足と
出ます。なお「動作環境-パフォーマンス」は最大値にしてあり、
PCのメモリ自体は2Gあります。
何か解決方法はありますでしょうか?よろしくお願いします。


日本語版XP+秀丸エディタVer.801



[ ]
RE:29413 grep時のメモリ不足No.29414
マボカル さん 11/01/25 16:42
 
ちなみに対象ファイル(.html)の文字コードはUTF-8です。

[ ]
RE:29414 grep時のメモリ不足No.29415
マボカル さん 11/01/25 16:45
 
対象ファイルを開いてソースを表示させると改行コードは

[UTF-8][LE]

と出ます。とりあえず参考になりそうな情報をお伝えしておきます。

[ ]
RE:29415 grep時のメモリ不足No.29417
秀丸担当 さん 11/01/25 17:19
 

ご迷惑をおかけして申し訳ありません。
何らかの処理の過程でメモリリークしてしまっているのだと思います。
もしV8.01〜V8.03の新しいβにかけて確認されれていた問題だとしたら、V8.03
の新しいβ版にしてみると変化がるかもしれないです。
以下のページの下の方からダウンロードできます。

 秀まるおのホームページ(サイトー企画) > ソフトウェア > 秀丸エディタ
 http://hide.maruo.co.jp/software/hidemaru.html

関連しそうなこととして、正規表現やあいまい検索を連続して行うとメモリ不足
になる問題がV8.02で修正されている点があるので、もしかしたら関係している
かもしれないです。


試しに連続して同様の操作を行うマクロを作って試してみた限りでは、有意にメ
モリ使用量が増えていくような状態を確認できませんでした。
何か条件がそろっていないと起きないのかもしれないです。

もし差し支えなければ設定情報をファイルに保存したものと、再現できそうなフ
ァイルがあるようでしたら送っていただけるとこちらでも確認できるかもしれま
せん。
もし送って頂ける場合、"PEH00775@nifty.com"まで秀丸担当宛であることを書い
て送っていただけると助かります。
お手数をおかけして申し訳ありません。

[ ]
RE:29417 grep時のメモリ不足No.29420
マボカル さん 11/01/26 09:09
 
ご回答ありがとうございます。

>もしV8.01〜V8.03の新しいβにかけて確認されれていた問題だとしたら、V8.03
>の新しいβ版にしてみると変化がるかもしれないです。

試してみます。ただデータが膨大なため、一回grepをかけるのも相当
時間を要しますので、新しいβ版での動作報告も遅くなるかもしれません。

>関連しそうなこととして、正規表現やあいまい検索を連続して行うとメモリ不足
>になる問題がV8.02で修正されている点があるので、もしかしたら関係している
>かもしれないです。

grep時に「追加の条件」をOFFのままで行うと最後まで検索されますが
ONにすると死んでしまうようです。

>もし差し支えなければ設定情報をファイルに保存したものと、再現できそうなフ
>ァイルがあるようでしたら送っていただけるとこちらでも確認できるかもしれま
>せん。

先ほど参考になりそうなファイルをお送りいたしました。

ご確認よろしくお願いいたします。

[ ]
RE:29420 grep時のメモリ不足No.29421
秀丸担当 さん 11/01/26 10:14
 

ファイルを受け取りました。ありがとうございます。

調査してみたところ、grep結果が長い行が多くあるようで、平均して1574文字く
らいのようです。
出力結果が350,000行で平均1574文字だとするとgrep結果だけで525MBで、元ファ
イルの総サイズの半分くらいを1つにまとめた感じになるようです。
「追加の条件」でgrepしたときは画面には出さずにいったん結果をメモリ上に保
持するため、メモリの再確保を連続して行う結果、本当にメモリ不足になってい
るのかもしれないです。
そうだとすると、V8.03の新しいβ版でも結果は同じかもしれません。
現状では幾つかに分けていただくしかないかもしれないです。

現状の方式ではこういう場合メモリ不足になってしまうと思うので、少なくとも
メモリ不足のエラーが出た後落ちてしまうような状態にはならないように検討さ
せていただきます。
あと、メモリの再確保を効率のいいように改善してみて、V8.03の次のβ版で修
正させていただきます。
たださらに多くなるとやはりメモリ不足になるかもしれないので、いったん一時
ファイルに置くような方法も必要かもしれません。

grep結果を秀丸エディタ上ではなくファイルに直接出力するようなオプションも
あったらいいかもしれません。これは今後のネタにさせていただきます。

[ ]
RE:29421 grep時のメモリ不足No.29423
マボカル さん 11/01/26 13:05
 
ありがとうございます。

>調査してみたところ、grep結果が長い行が多くあるようで、平均して1574文字く
>らいのようです。
>出力結果が350,000行で平均1574文字だとするとgrep結果だけで525MBで、元ファ
>イルの総サイズの半分くらいを1つにまとめた感じになるようです。
>「追加の条件」でgrepしたときは画面には出さずにいったん結果をメモリ上に保
>持するため、メモリの再確保を連続して行う結果、本当にメモリ不足になってい
>るのかもしれないです。

なるほど。そういう仕組みだったのですね。

>そうだとすると、V8.03の新しいβ版でも結果は同じかもしれません。
>現状では幾つかに分けていただくしかないかもしれないです。

V8.03の新しいβ版でも同じように死んでしまいましたので、本当に
メモリ不足による現象でしょうね。ちなみに「追加の条件」をOFFで
grepした際の結果ファイルは800MB近くにもなっていたので、現状で
「追加の条件」をONでgrepをかけると確実にメモリ不足になりますね。
フォルダでいくつかに分けて作業を行いたいと思います。原因が
分かってすっきりしました。

>現状の方式ではこういう場合メモリ不足になってしまうと思うので、少なくとも
>メモリ不足のエラーが出た後落ちてしまうような状態にはならないように検討さ
>せていただきます。
>あと、メモリの再確保を効率のいいように改善してみて、V8.03の次のβ版で修
>正させていただきます。
>たださらに多くなるとやはりメモリ不足になるかもしれないので、いったん一時
>ファイルに置くような方法も必要かもしれません。
>
>grep結果を秀丸エディタ上ではなくファイルに直接出力するようなオプションも
>あったらいいかもしれません。これは今後のネタにさせていただきます。

今回のような作業は一般的ではありませんが、おっしゃるように何か
解決になるオプション的なものがあればうれしいですね。

ネタとして・・

grepで引っ張ってこれる1行の文字数に制限があるのはgrep後の
ファイルを確認する中で初めて気付きましたが、もし対象ファイルの
中でそのような制限文字数以上の行が見つかったら、grep終了後の
ダイアログに「一部に2048文字制限以上の行が検索されました。
2048文字を超えたテキスト部分は切れて表示されません」みたいな
表示が出るとありがたいです。機械的に判断できればの話ですが。

そうすれば裏技の「追加の条件」をONで再度grepをかけて検索し、
全ての行を表示することができると思います。また思い切ってここは
裏技にするのではなく、「2048文字制限以上の行のgrep」オプション
を作って、そこにチェックを入れると、「#ifdef等の無効部分」
「を除く」と同じような動きをするとか。


[ ]
RE:29423 grep時のメモリ不足No.29424
秀丸担当 さん 11/01/26 16:38
 

お手数をおかけしてすみません。

>grepで引っ張ってこれる1行の文字数に制限があるのはgrep後の
>ファイルを確認する中で初めて気付きましたが、もし対象ファイルの
>中でそのような制限文字数以上の行が見つかったら、grep終了後の
>ダイアログに「一部に2048文字制限以上の行が検索されました。
>2048文字を超えたテキスト部分は切れて表示されません」みたいな
>表示が出るとありがたいです。機械的に判断できればの話ですが。

何らかの形で通知ができたらいいと思います。
メッセージボックスが1つ多く出ると操作回数が増えてしまうということにもな
ってしまうかもしれないので、クリックなどが必要の無い形で表示できたらいい
かもしれません。
参考にさせていただきます。

>そうすれば裏技の「追加の条件」をONで再度grepをかけて検索し、
>全ての行を表示することができると思います。また思い切ってここは
>裏技にするのではなく、「2048文字制限以上の行のgrep」オプション
>を作って、そこにチェックを入れると、「#ifdef等の無効部分」
>「を除く」と同じような動きをするとか。

こちらも、それ専用のオプションがあったらいいと思います。
こちらもネタにさせていただきます。

[ ]