• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:パターンマッチングにおいて変数を使いたい (2))

パターンマッチングで使用する変数とは?

このQ&Aのポイント
  • パターンマッチングにおいて変数を使いたい質問で無事解決したが、中身の理解ができていない
  • ファイルに出力すると結果のデータが表示されない問題が発生
  • データが膨大なため処理が遅く、プログラムが終了するまで結果が表示されない

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

fu_meさんのプログラムでは二重ループ(whileとfor)を使っています。 仮に、key.csvが1000件、data.csvが100万件の場合、10億回のマッチング処理が行なわれます。 一般に、性能を上げるため、大きなデータの突合せでは、なるべく二重ループを使用しないようにします。そのために、以下の例では、key.csvのデータを連想配列のキーにしています。 また、正規表現はそれ程高速ではないので、この手の処理では余り使わないようにします(実際に測って比較した訳ではありませんが、私はそうします)。 ============================================ %keys = (); open(KEY, "<key.csv"); while ($k = <KEY>) { chomp($k); $keys{$k} = 1; } close(KEY); open(OUT, ">res.csv"); open(VAL, "<data.csv"); while ($data = <VAL>) { $rindex = rindex($data, '-'); if ($rindex > 0) { $search = substr($data, 0, $rindex); if (exists($keys{$search})) { print OUT $data; } } } close(VAL); close(OUT); ============================================ 上記プログラムでは、いくつかの仮定を置いています。 ・key.csvの各行データはユニークである ・data.csvの各行の最後の「-」が「区切り」となる。  つまり U1306-2005-05-16 12:00-xxx,1 の「xxx」の部分などに「-」を含まない。  (従って U1306-2005-05-16 12:00-xx-yy,1 のような形式は想定外です)。 > また、data.csvのデータが膨大であるせいか標準出力においても、終了するまでやたらおそいです。 > 一瞬で該当データを表示(最終結果)してくれるのですが、その後数10分間何かの処理をした後、何も表示することなくプログラムが終了します。 > この処理は何をしているのでしょうか? 実際のデータを見ないと判りませんが、data.csvの先頭のほうに「当たり」が偏っているのかもしれません。

fu_me
質問者

お礼

ありがとうございました。解決しました。 >key.csvが1000件、data.csvが100万件の場合、10億回のマッチング処理が行なわれます。 どうやら10億回以上のマッチングを行わせていたようですw

その他の回答 (1)

回答No.2

連続投稿すみません。一点補足です。 > 標準出力では正しい結果が表示されます。しかしファイルに出力すると結果のデータが出力されません。どこが間違っているのでしょうか? 標準出力の場合、逐次結果が出力されますが、ファイルの場合はそうではありません。openの段階で空のファイルが生成されますが、直ちにデータがファイルの中身に反映されることはありません。 それから、fu_meさんのプログラムでは、close(OUT)が漏れてます。プログラム終了時に勝手にcloseされるため、結果に影響することは無いと思いますが、付けた方がよいと思います。

fu_me
質問者

お礼

ご指摘ありがとうございます。 中途半端なファイル生成が起こっていた原因がわかりました。

関連するQ&A