• ベストアンサー

perlCGIが動かなくないました。改良していただけないでしょうか?

下記のようなperl-cgiをプロバイダのサーバで使っていたのですが、最近、動かなくなりました。 多分、読み込むファイルの大きさが大きすぎて、途中で止まっているのではないかと思います。 (試しに、10M程度のファイルで行うと、問題なく動きました) 因みに、現在のサイズは、50MBくらいです。 これからも、肥大の一途とたどるのですが、なるべく、サーバに負担をかけず同じファイルを作成できないものでしょうか? とても、困っています。 どなたか、改良できる方、何卒、宜しくお願い致します。 #下記は、INfilenemeから、重複する行を削除して、Outfilenameというファイルを作るperlコードです。 open(IN, "INfilename.txt"); @array = <IN>; close (IN); %count; @array = grep(!$count{$_}++, @array); open(OUT, ">Outfilename.txt"); print OUT join("",@array); close (OUT);

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

  • ベストアンサー
  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.2

メモリー上に全て読み込むのがマズイのでは?と思います 読んだその場でprintしてしまえば?とか・・・ open(IN, "INfilename.txt"); open(OUT, ">Outfilename.txt"); while(<IN>){ if(!exists($count{$_})){$count{$_}++;print OUT $_;} } close (IN,OUT);

ayu_mi_nic
質問者

お礼

コードを試してみたところ、無事解決いたしました!! 本当に、ありがとうございました。

その他の回答 (1)

  • agharta
  • ベストアンサー率52% (54/103)
回答No.1

こんな感じですかね。 確かめていないので、動かないかも… 用は、一気に@arrayに入れているのが遅くなる原因ではないでしょうか。 ただ、50MBぐらいで負担はかからないような気がするのですが、気のせいでしょうか。 my %count; open(IN, "INfilename.txt"); while (my $line = <IN>) { $count{$line}++; } close (IN); open(OUT, ">Outfilename.txt"); print OUT join("",keys(%count)); close (OUT);

ayu_mi_nic
質問者

お礼

コードを試してみたところ、無事解決いたしました!! 本当に、ありがとうございました。