• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プログラムの高速化)

プログラムの高速化について

このQ&Aのポイント
  • プログラムの高速化について相談です。ディレクトリ内の大量のテキストファイルを効率的に処理する方法を教えてください。
  • ディレクトリ内の数千のテキストファイルを高速で処理する方法を教えてください。ソースコードの改善案をお待ちしています。
  • プログラムの処理速度を向上させる方法についてアドバイスをいただけないでしょうか?ディレクトリ内のテキストファイルを効率的に操作したいです。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

どこが律速かわからないので効率的な高速化手法はちょっとわからないのですが, とりあえず「ファイル操作はなるべく減らす」という方針はどうでしょうか. 現状だと各ファイルの 1行ごとに「出力ファイルのオープン→1行出力→クローズ」を繰り返していますが, ハッシュを使えば無駄なオープン/クローズを減らすことができるはずです. 例えば open(FILE, $dir) or die "$dir: $!"; my %contents; while (my $line = <FILE>) { my ($a, $b) = split(/,/, $line); push @{$contents{"$a,$b"}}, $line; } close(FILE); while (my ($filename, $contents) = each %contents) { open(NEWFILE, ">>./out/$filename.txt") or die "$dir: $!"; print NEWFILE @$contents; close(NEWFILE); } のような感じにすればちょっとは速くなるんじゃないかな.

oswll
質問者

お礼

Tacosan様 ご回答ありがとうございます.ハッシュをつかったところ速度はすこし上がっていました.参考になります.ここまで来ると律速はハードの方になりますね.ramdiskでやったら速度は3倍くらいでました.

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

そもそも、現状でその数千個のファイルを処理するのにどのくらい時間を要していて、 どのくらいにまで短縮しなければならないんですか?

oswll
質問者

補足

現状では,2時間で400個だったので,概算ですが,44時間ほどかかりそうです.今思いついたのが,入力するファイルを半分に分けて最後に結合するという方法です.C2Dなのでひとつ処理する時間も二つ処理する時間も同じなので,こうすれば半分になることに気づきました. 時間ははやければ早いほど良いです.

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

Perlは詳しくないのですが、マルチプロセスにしたらどうでしょう。 つまり、ファイルを処理するPerlプログラムは別に作っておき、 コマンドラインからファイル名を与えるようにします。 ファイル名を取得する方はファイル名を取得しては別シェルで ファイルを処理するPerlプログラムを起動します。 あまり沢山プロセスを稼動させてしまうと、かえって遅くなるかも 知れないので、10ファイルくらいずつ増減させて、最適値を見つけ ます。最適値はマシンスペックやメモリ搭載量に依存します。

oswll
質問者

お礼

nda23様 ご回答ありがとうござます.なるほどマルチプロセスですか. 確かにいちいちsplitしてファイル名を作っているので,今回の場合,ファイル名の一覧を簡単にできそうなので良さそうですね.

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

perl は、インタプリタ型言語なので、本格的に高速化を望むようでしたら、c などのコンパイラ言語にする方が早道です。

oswll
質問者

お礼

DIooggooID様 ご回答ありがとうございます.なるほどCですか.Cはファイル操作の閾が私にはちょっと高いのでPerlでやっています.

関連するQ&A