• ベストアンサー

差分の取得

Aファイルとして Number, Total 1, 15 2, 12 3, 9 Bファイルとして Number, Total 1, 19 2, 13 3, 21 ふたつのファイルの同じ番号の差を取得したい。 結果として Cファイル 1, 4 2, 1 3, 11 Aファイル、Bファイルそれぞれを配列に入れて、 番号毎に計算させる方法で一応できているのですが、 かなり時間がかかっている? メモリーの使いすぎ? のようです。 もっと良い方法があれば、教えてください。 宜しくお願いします。

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

補足のスクリプトに、100行のデータを食わせた時の実行時間は、0.17秒でした。 (環境=PowerPC/500MHz、Mem=320MB) 「時間がかかっている」ってのが、どれくらいだか不明ですが、2~3秒くらいなら、そんなに気にする事ないのでは。

maiton
質問者

補足

ありがとうございました。 なぜか自分のところだと、すごく時間がかかるので、 いろいろと試していたところ、データの添え字になる部分があまりに大きすぎるではないかということに気づきました。 実際、小さな数字を使うと早いのですが、同じ100行程度のレコード数でも 60005003 これくらいの数字が 配列の添え字になると極端に遅くなり、メモリー不足に なったりします。 番号は、6千万台の数字が不規則に100行ほど現れます。 なにか良い方法はないでしょうか? 初めの質問と変わってしまって申し訳ございません。

その他の回答 (1)

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

基本的に問題ないような気がします。 よほど大きなファイルを読み込んでいるのでしょうか? 読み込むファイルサイズ(データの数)はどのぐらいですか? そういうわけでないのなら、コードにバグがある可能性も捨て切れません。 差し支えなければ、どのようなコードか補足していただけますか?

maiton
質問者

補足

お返事ありがとうございます。 データは100行程度です。 $fa = "./data/mittl56a.csv"; # CHANGE HERE!!! $fb = "./data/mittl56.csv"; # CHANGE HERE!!! $fc = ">./data/mittl56pm.csv"; # CHANGE HERE!!! $fd = ">./data/mittl56a.csv"; # CHANGE HERE!!! open ( AM, "$fa") || die "cannot open $fa for reading"; open ( AP, "$fb") || die "cannot open $fb for reading"; open ( PM, "$fc") || die "cannot open $fc for reading"; while ($line = <AM> ){ ($mino,$miname,$cnt,$ttl,$ttt)= split(/,/, $line); $amcnt[$mino] = $cnt; $amttl[$mino] = $ttl; $name[$mino] = $miname; $mno[$mino] = $mino; } while ($line = <AP> ){ ($mino,$miname,$cnt,$ttl,$ttt)= split(/,/, $line); $apcnt[$mino] = $cnt; $apttl[$mino] = $ttl; $name[$mino] = $miname; $mno[$mino] = $mino; } for $no (@mno) { $pmcnt[$no] = $apcnt[$no] - $amcnt[$no]; $pmttl[$no] = $apttl[$no] - $amttl[$no]; printf PM ("%10d,%18s,%12d,%16d\n",$no,$name[$no],$pmcnt[$no],$pmttl[$no]); } 宜しくお願いします。 $name[$mino] = $miname; $mno[$mino] = $mino; を2度読み込ませているのは、必ず両方のファイルに 番号が存在するかどうかわからないので、両方読ませて 全ての番号を網羅するようにしています。

関連するQ&A