- ベストアンサー
パターンマッチングで使用する変数とは?
- パターンマッチングにおいて変数を使いたい質問で無事解決したが、中身の理解ができていない
- ファイルに出力すると結果のデータが表示されない問題が発生
- データが膨大なため処理が遅く、プログラムが終了するまで結果が表示されない
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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の先頭のほうに「当たり」が偏っているのかもしれません。
その他の回答 (1)
- fdsjaklfjas
- ベストアンサー率81% (96/118)
連続投稿すみません。一点補足です。 > 標準出力では正しい結果が表示されます。しかしファイルに出力すると結果のデータが出力されません。どこが間違っているのでしょうか? 標準出力の場合、逐次結果が出力されますが、ファイルの場合はそうではありません。openの段階で空のファイルが生成されますが、直ちにデータがファイルの中身に反映されることはありません。 それから、fu_meさんのプログラムでは、close(OUT)が漏れてます。プログラム終了時に勝手にcloseされるため、結果に影響することは無いと思いますが、付けた方がよいと思います。
お礼
ご指摘ありがとうございます。 中途半端なファイル生成が起こっていた原因がわかりました。
お礼
ありがとうございました。解決しました。 >key.csvが1000件、data.csvが100万件の場合、10億回のマッチング処理が行なわれます。 どうやら10億回以上のマッチングを行わせていたようですw