• 締切済み

ファイル操作について

例えば1つのディレクトリに10万個の画像があった場合に、同じディレクトリ内にperlで新しい画像を作ったり削除したりすると、処理速度が遅くなってしまいます。(作成や削除に時間がかかったりする) 違うディレクトリではスムーズに画像を作成したり、削除したりできるのですが、大量のファイルがあった場合は遅くなってしまうようです。 perlでファイルを作ったり削除するのに、ファイル数が多いからという理由で速度が遅くなるものでしょうか。 また、何か対策をご存知であれば教えていただけると嬉しく思います。 よろしくお願いします。

  • hana43
  • お礼率49% (105/212)
  • Perl
  • 回答数3
  • ありがとう数10

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

ディレクトリの中から目的のファイルを探すための時間に、差が出る可能性は有ります。 ただ、単に「指定した名前のファイルを削除」とかだったら、極端に遅くなるとは考えられません。 何か、他の処理で時間がかかっているのでは? 例えば、「削除対象のファイルかどうかを、全部のファイルについて個々に調査している」とか

hana43
質問者

補足

ありがとうございます。 >例えば、「削除対象のファイルかどうかを、全部のファイルについて個々に調査している」とか こちらは全部のファイルから対象のファイルがあるかどうかの存在確認をしてといった意味でしょうか? もしそうでしたら、そういう風な使い方はしております。 このような場合は速度が落ちてしまうものなのでしょうか。

回答No.2

遅くなりませんよ。RAMDISKでファイルアクセスを実験したので参考程度ですが、 10万個のファイルのあるディレクトリで、perlで1万回ファイル作成と削除を繰り返しても0.2秒程度です。 $ cat hoge.sh mkdir -p /tmp/file_test cd /tmp/file_test touch test_{1..100000}.txt time perl -e 'for (1 .. 10000){open my $fh, ">", "hoge.txt"; print {$fh} "hoge"; close $fh; unlink "hoge.txt";}' $ bash hoge.sh real 0m0.202s user 0m0.068s sys 0m0.132s

hana43
質問者

お礼

調査していただきありがとうございます。 他に原因があるのかやってみましたが、やはり遅くなってしまいます。 再度最初からやってみたいと思います。 ありがとうございました。

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

確認ですが, 「perlで」遅いということでしょうか? いいかえると Perl 以外の言語で書いたプログラムでは遅くないんだけど Perl でプログラムを書いたときだけ遅い ということでしょうか?

hana43
質問者

補足

perl以外の言語は使った事がありませんが、linuxのコマンド等で削除したり操作する際は特に遅く感じません。 なので原因がよく分からないのですが…

関連するQ&A

  • (サーバ・UNIX)は、ひとつのディレクトリに何ファイルまでおいても良いですか?

    (サーバ・UNIX)は、ひとつのディレクトリに何ファイルまでおいても良いですか? 私は、Windowsしか使ったことが無いので、感覚というものが良く分からないのですが、 通常、Windowsの場合、1つのディレクトリに1000ファイル以上置くと動作が重くなります。 10000を超えるとパソコンがフリーズしてしまいます(Win98)。 そのため、1ディレクトリには1000程度にするよう、心がけています。 しかし、サーバの場合は、大抵、UNIXを使っているため、ファイル管理が非常に優秀だと聞きます。 ということは、1つのディレクトリにいくら置いても問題ないということでしょうか? レンタルサーバの空き容量がまだ、1900Mもあるため、CGIの練習も兼ねて、 時間列で、画像ファイル(ライブカメラ)をどんどん記録することを考えています。 たくさんのディレクトリを作って、時間や日付で分けることも考えたのですが、 ディレクトリ分けしても、しなくても呼び出し速度が殆ど換わらないのであれば、 1つのディレクトリにおきたいと思っています。 ファイル情報の取得など、1ディレクトリですととても簡単にできるので・・・ そして、容量が近くなったら、古いものから順番に削除していく。 or 日付の古いものを削除していく。 なお、転送容量にはは問題はなかったのですが、サーバに過度の負担をかけることは禁止でした。 ちなみに、呼び出す時は、そのディレクトリ中から画像を30枚ほどランダムに選んで表示する予定です。 画像のサイズは極小の2KB程度です。 以上の作成を考えております。そこで、長くなりましたが、ファイル管理についてご返答、 何卒、宜しくお願い致します。

  • perl-cgi「日時によるファイル操作」について

    perl-cgi「日時によるファイル操作」について perl-cgiで、あるディレクトリ中のファイル更新日が最も若い2ファイルを表示して、それ以外を削除したいのですがどのようにすればよいでしょうか? #調べたいディレクトリを読み込む。 $Dir = "./cache"; opendir DIR,"$Dir"; my @alldir = readdir DIR; close DIR; #ファイル(パス)名と作成日時を求める。 #最新2つのファイルパス(名)を表示する。 print "NewFile".ファイルパス1; print "<HR>"; print "OldFile".ファイルパス2; #最新2つ以外は全て削除 unlink($_); exit(0);

    • ベストアンサー
    • Perl
  • ディレクトリ操作

    PERLでディレクトリの操作をするときの文法を教えていただけないでしょうか。 ディレクトリオープンは判るのですが・・・、 ディレクトリ作成・ディレクトリの名前変更 ディレクトリの削除・ディレクトリの存在確認 が判りません。どうかご指南お願いいたします。

    • ベストアンサー
    • CGI
  • Perlについて

    処理速度について質問です。 ファイルを大量(4000~8000程度)に扱う処理でディレクトリ内にあるファイルを  「-f $file」 で検索する処理ありますが、 ファイルが8000あったとして、半分づつディレクトリを分けて検索した場合、 処理速度は変わるでしょうか? ※この処理は 2万~3万回/1日 は実行されます。

  • Linuxのディレクトリエントリのサイズについて

    開発したアプリケーションで、あるディレクトリにファイルを作成し、 処理が終わったらそのディレクトリ中に作成したファイルを削除する という処理を行っています。 処理を行っている最中に「No such File or Directory」というエラーが 出ましたが、次の処理では問題なくファイルの作成、削除の処理が うまく行われていました。 作業用に使っているディレクトリ名を仮に「PDF」という名前とすると、 lsコマンドで見てみると、PDFディレクトリのサイズが、1507328 となっていました。 (ディレクトリのサイズは、4092のことが多いと考えます。) 「ディレクトリエントリ」というものがあって、たとえディレクトリ内のファイルを 消去したとしても、ディレクトリ内にファイルを作成した場合は、 ディレクトリのサイズは大きくなるということまでは理解できたのですが、 なぜ、「No such File or Directory」が出てしまったのかを調べたいです。 たとえば (1)Linux(32bit)では、ディレクトリエントリのサイズに上限がある (2)Linux(32bit)では、ディレクトリエントリのサイズが大きいと、さらにディレクトリの  サイズを拡張する場合は時間がかかる場合がある などのことがあるなど、ご存知の方はいらっしゃらないでしょうか。 Linuxは、Redhat 5.7(32bit)を使っています。 憶測としては、PDFディレクトリ下にファイルを作成した際に、ディレクトリエントリの サイズを拡張しようとして、少し時間がかかり、そのためにファイルが作成されずに アプリケーション側で作成したファイルを参照しようとした際にファイルを見つける ことができずに「No such File or Directory」とOSが返してきたのではないかと 考えています。 どうぞ、識者の方、ご教示いただければ幸甚です。 よろしくお願いいたします。

  • PHP ディレクトリ内のファイルを削除

    PHP ディレクトリ内のファイルを削除 PHPでフォームから数枚の画像をサーバへアップロードできるページを作成しました。 これをアップ日から1週経過していれば削除というような処理をしたのですがヒントをいただけますでしょうか。 ディレクトリ内にある画像のアップ日時を取得し、現在の日時から計算し、1週間経過していれば削除、という感じでしょうか。さらにこれが自動化できれば最高です。。 http://www.phppro.jp/qa/871 上記の記事からディレクトリ内のファイル削除自体は参考にできました。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ディレクトリやファイルの操作

    環境:ASP(VBScript) サーバー:Windows2000server もちろんサーバーの上のファイルに対してですが、 ディレクトリを作成したりファイルを削除したり、リネームしたりすることは可能ですか? 可能なら教えてください。

  • ファイル操作

    ファイル操作について、プログラムがうまくできないので教えていただきたいです。 作っているのは、txtファイルを読み込んで、置換の処理をした結果を、test.txtファイルに書き出したいのです。 質問なのですが、ここでtest.txtはあらかじめ作成しておかなければならないのでしょうか。自動で作成させる方法があれば、教えてください。 -----------------data.txt------------------------ rabbitうさぎappleりんごcoffeeコーヒー ------------------------------------------------ -----------------apple.pl----------------------- open(FILEHANDLE,"data.txt"); while($str=<FILEHANDLE>){ $str=~s/apple/青りんご/; } close(FILEHANDLE); open(FILEHANDLE,"test.txt"); print FILEHANDLE $str; close(FILEHANDLE); ------------------------------------------------- また、コマンドプロンプトの結果は次のとおりです。 C:\Perl>perl -cw apple.pl apple.pl syntax OK C:\Perl>perl apple.pl C:\Perl> Perl初心者なため、詳しく教えていただけると助かります。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 1ファイルずつ読み込みたい

    ウィンドウズ環境でactive perlを利用しています。 あるディレクトリーの中に2000位のファイルが入っており、このファイルを読み込んで置換処理を行うため下記のようなperlを作っています。 1ファイルはおおよそ3000行くらいです。 foreach(<*.html>) { open(IN_FILE, $_) || die; open(OUT, ">$_.tmp") || die; @record=<IN_FILE>; foreach $record (@record){ $record =~s/aaa/bbb/isg; } print OUT @record; close( IN_FILE); close( OUT); rename("$_.tmp", $_) ; } 当たり前かもわかりませんが、メモリー不足になり処理が中断します。 ディレクトリーの中のファイル数を600程度に少なくすると処理が完了します。 そこで質問なのですが、ディレクトリーの中のファィルを一度に全部読み込まず、1ファイルずつ順次読み込んでいくことはできないでしょうか。 最初の1行目のforeachをwhileに変えたりしたのですがうまくいきません。 対応策あればご教示ください。

    • ベストアンサー
    • Perl
  • 大量のファイル/フォルダを操作するとシステムが遅くなる

    MSのサポートサイトに以下の報告があります(JP413407) ====== 大量のファイル・フォルダの操作を実行するとシステムが遅くなる。 この資料は以下の製品について記述したものです。 Microsoft(R) Windows(R) 98 Second Edition 現象 エクスプローラ (デスクトップを含む) にて、大量のファイル・フォルダの移動、コピー、削除等の 一括操作を行った後、システムの処理が遅くなる場合があります。 回避策 MS-DOS プロンプトの move、 copy、 xcopy、 del 等のコマンドを利用して大量のファイル・フォルダの 一括操作を行った場合は、この現象は発生しません。 ========= 大量のファイルを削除等した後、必ずこの現象に悩まされています。新規テキストファイルの作成も1分以上かかります。 ファイル名の変更も同じ。 再起動すれば正常応答に戻るのですが、うんざりしています。 ただ上にあるとおり、MSも認めているのですがその理由が示されていません。 くやしいので応答が遅くなる理由だけでも知りたいのですが、どなたか解説していただけないでしょうか。 今までこんな現象はなかったように思うのですが、最近必ず生じます。 システムの環境にも影響されるのでしょうか。 98SE,P3-800MHz,128MB,60GBです。