HDDを壊しやすいデータの保存方法?について

このQ&Aのポイント
  • HDDを壊しやすいデータの保存方法について教えてください。
  • Perlプログラムで大量のgifをHDDに保存していると、ディレクトリ構造が壊れたり、HDDが論理障害を起こします。外付けUSB-HDDに保存しています。
  • HDDの限界なのか、プログラムの書き方が間違っているのでしょうか?
回答を見る
  • ベストアンサー

HDDを壊しやすいデータの保存方法?について

下記の様なPerlプログラムで、毎日大量のgif(1日20000個のgif)をHDDに保存しています。 100日程度経過すると、ディレクトリ構造が壊れたり、かなりの頻度でHDDが論理障害を起こします。 WindowsXPで外付けUSB-HDDに保存しています。 HDDの限界なのか、単に、プログラムの書き方が間違っているのでしょうか? #perlのgif保存プログラム1日1回起動 for my $num (1..20000) { open(OUT, ">./gif/$year$month$day$num") ; binmode OUT; print OUT &GetImg($image); close (OUT); sleep 1; }

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

  • ベストアンサー
  • tk_uc
  • ベストアンサー率68% (33/48)
回答No.2

確かにntfsには仕様上の制限はありませんが、フォルダを開くときに時間がかかったりメモリーを食ったりするかと思いますので、お勧めはしません。 無制限というのはあくまで仕様上のもので、実際の使用時にはCPUであったりメモリーであったり、アプリケーションであったり、何らかの制限がかかってくるのだと思います。 ディレクトリで分けても症状が同じなのでしたら、パーティション内のファイル数とかなのかもしれませんね。 それも仕様上は無制限なのでしょうけど。 ファイル数が問題なのか、容量が問題なのか。 あるいは、ディスク上の特定の領域に書き込む際に問題が生じるのか。 お役に立てずすみません。

pevtone
質問者

お礼

以前、どこかのHPでエクスプローラーを使ってアクセスしない(フォルダーを開かない)で、他のソフトで直接呼び出す場合、フォルダー分けしてもNTFの構造上?意味が無いという話を聞いたため余り気にしていません。 また、NTFSやファイル数など数に原因であれば、2TBなど(現在は250GBを利用中)の超大容量HDDになると確実にディレクトリが壊れそうです。 恐らく、そんなことは無いと思いますので、Perlプログラムがまずいのかとも思っています。 >お役に立てずすみません。 とんでもありません。 回答いただき本当にありがとうございます。

その他の回答 (1)

  • tk_uc
  • ベストアンサー率68% (33/48)
回答No.1

同じディレクトリにたくさんファイルを作成しすぎなのでは? ご利用のファイルシステムの仕様を確認してみてください。 とりあえず、 ./gif/$year/$month/$day/$num のように階層を分けてみてはどうでしょうか。

pevtone
質問者

お礼

回答いただきありがとうございます。 NTFSなので制限は無いと思います。 それでも一つのディレクトリに大量のファイルがあることはまずいですかね? また、記憶が曖昧なのですが、ご指定の様にディレクトリを分けて保存していた時期もあるのですが、この時もエラーが出た記憶があります。

関連するQ&A

  • 画像ファイルの作成方法

    私は、外部の画像ファイルを読み込まずにperlファイルで表示、ファイル作成をすればよいか困っております。 プログラムは、 読み込み⇒画像作成⇒終了 というような感じです。 Perlの勉強段階などでモジュールなどを使わないようにしたいと思っています。 今までで実験してみた方法は、gifファイルを拡張子.txtに変えてそのファイルをコピーしプログラムに貼り付けたものです。 画像作成 (flockは除いています。) #!/usr/bin/perl open(OUT,"> test.gif"); binmode(OUT); print OUT <<'EOM'; コピーしたもの EOM exit; 以上の文でファイルは作成されているものの、画像を表示すると×状態です。 どのように修正すればよいかご指摘お願いします。

    • ベストアンサー
    • Perl
  • 指定したフォルダにアップロード

    Perlを使用してアップローダーを作成しました。 今までは # 受信データを書き込む open OUT,">$fnme"; binmode OUT; print OUT $in{'upfile'}; close OUT; としていたんですが、これではファイル数が多くなった時にエライことになるので、ディレクトリを作成してその中に…と思いまして。 で、ディレクトリをオープンが opendir DIR, "$folder_name"; ということはわかったのですが、 これを上記と組み合わせるにはどうしたらいいのでしょうか? ためしに opendir DIR, "$folder_name"; open OUT, ">$fnme"; binmode OUT; print OUT $in{'upfile'}; close OUT; closedir folder; としてみましたが、普通にcgiがあるフォルダにアップロードされてしまいました(^^; ディレクトリの中のファイル名を取得とかはあったんですが、指定のフォルダにアップロード、が見つからなくて…。

    • ベストアンサー
    • Perl
  • ファイルデータの入れ替えについての質問

    お世話になります ファイルの内容は $s_get_year<>$s_get_month<>@chk<>\n このような並び方です POSTメソッドで送られてきたデータ$get_yearと$get_monthが 一番目のデータ($s_get_year)と2番目のデータ($s_get_month)と同じならば その行を入れ替えて、そうでなければ追加して書き込むという処理を行いたいのですが 下記のようにしたのですが思い通りの動作をしません、御教授お願いします。 sub ho_disc_write { @new=(); open(IN,"$holidayfile") || &error("Open Error : $holidayfile"); while (<IN>) { ($s_get_year,$s_get_month) = split /<>/, $_, 2; if ($s_get_year == $get_year && $get_month == $s_get_month) { $_ = join('<>',$get_year,$get_month,@chk,"\n"); } push(@new,$_); } close(IN); # データ上書き open(OUT,">$holidayfile") || &error("Write Error : $holidayfile"); print OUT @new; close(OUT); exit; }

    • ベストアンサー
    • Perl
  • GD.pmで作成した画像を保存する方法

    GD.pm 2.32 + Perlで、作った画像の保存を試みています。 しかし保存されません。 $png_data = $myImage->png; open (DISPLAY,"test.png") || die; binmode DISPLAY; print DISPLAY $png_data; close DISPLAY; フォルダのパーミッションは777 test.pngのパーミッションは666 原因は分かりますでしょうか。 宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • perl で 画像を取得したい

    下記perlのコードを書いたのですが、なぜか、画像を取得することができません。 メモ帳で開くと、画像データっぽい文字列はあるのですが、普通に見ることができません。 なぜでしょうか?また、どのように改良すれば取得できますか? ご存知の方教えていただけないでしょうか? 宜しくお願い致します。 $source = &GetImg('http://www.goo.ne.jp/img/logo/gootop_logo.gif'); $FileOut = "tmp.gif"; open(OUT, ">$FileOut"); print OUT $source; close (OUT); sub GetImg() { my($url) = @_; use LWP::UserAgent; my $browser = LWP::UserAgent->new; my $response = $browser->get($url,'User-Agent' => 'Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007'); my $img_file = $response->content; return $img_file; }

    • ベストアンサー
    • Perl
  • Schemeのプログラミング うるう年関連

    Schemeのプログラミング うるう年関連 Schemeで、 「(1)閏年かどうかを判定する関数leap?(number -> boolean)を定義した後、(2)○年○月の日数は何日かを求める関数num-of-days(number number -> number)を定義せよ」 という内容の課題を出されたのですが、(例えば 2009年の7月→31日 2012年の2月→29日) どうもエラーが出て実行できません。 自分は以下のように組みました。 ;;(1)の関数 (define (leap? year) (cond [(= (remainder year 400) 0) #t] [(and (= (remainder year 4) 0)(> (remainder year 100) 0)) #t] [else #f] ) ) ;;(2)の関数 (define (num-of-days year month) (cond [(and (= month 2)(= (leap? year) #t)) 29] [(and (= month 2)(= (leap? year) #f)) 28] [(or (= month 1)(= month 3)(= month 5) (= month 7)(= month 8)(= month 10) (= month 12)) 31] [else 30] ) ) これを例えば (num-of-days 2008 4) や (num-of-days 1995 12) などとして実行すると、それぞれ30,31という正しい値を返してくれるのですが、 (num-of-days 2008 2) や (num-of-days 1995 2) など、閏年・非閏年に関係無く、2月が絡むと =: expects type <number> as 1st argument, given: false; other arguments were: true というエラーを吐いてしまいます。 何度も見直しましたが、どこが間違っているのか見付けきれません…。どなたか間違いを指摘して頂けると幸いです。

  • perlでCSV形式ファイルのアップロード

    本日、同じ質問をしたものです。 前回の問題は解決したのですが、ファイルがアップロードできないで悩んでします。 CGIのプログラムは以下のソースです。 #! c:/perl/bin/perl use CGI; # CGIヘッダーの出力 print "Content-type: text/html\n\n"; my ($query,$fileName); $query = new CGI; $fileName = $query->param('fileName'); open(OUT, ">./a.csv"); binmode(OUT); while(read($fileName,$buffer,1024)) { print OUT $buffer; } close(OUT); close($fileName); #ファイルハンドルをcloseしています。 exit ; ファイルは、作られるのですが、中身が書き込まれません。 どなたか教えてください。 お願いします。

    • ベストアンサー
    • Perl
  • データ件数が多くなってもエラーにならない方法

    perlで、URLからサイトが表示されるかを確認するプログラムを作成しました。 ただ現在の方法だと、チェックするデータ件数が多くなるとエラーとなってしまいます。 現在のソース (ここから) open(DB,"$memfile") || &error("Open Error : $memfile"); flock DB, 2; @lines = <DB>; close(DB); @new=(); foreach $line (@lines) { $flag=0; ($num,$url,$title) = split("<>", $line); &url_ckeck("$url"); $data = "$num<>$url<>$title\n"; $data =~ s/\n<>/<>/g; $data =~ s/\r\n<>/<>/g; $data =~ s/\r<>/<>/g; push(@new,$data); } open OUT, "> $memfile"; print OUT @new; close OUT; (ここまで) この方法だと300件を超えると「ページが表示出来ない」エラーがでてしまうので、 チェックの方法を小分けしてエラー回避できないかを考えているのですが、とのようにすれば良いのかがわからず先に進められなくなってしまいました。 プログラムも見よう見真似で作成しているのでおかしな箇所が多々あるかと思いますが、助けていただけないかと思い書き込みました。 「$line (@lines)」を「$start .. $end」として件数を小分けにしてボタンを表示させてクリックして進められるようにしてみたらとも思いましたが データがうまく更新出来ずにいます。 不明点はご指摘ください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイル出力をUTF8NではなくてUTF8で行いたい

    おせわになります。 Shift-JISで記述したPerlで、ファイル出力をしようとしています。 ------------------------------------ #!/usr/local/bin/perl use encoding 'shiftjis'; $hoge="ほげ" open(OUT,">file.txt") binmode OUT; print OUT $hoge; close(OUT); ------------------------------------ 希望はUTF8での出力なのですが、UTF8Nで出力されてしまいます。 どのようにすればいいのかご教授よろしくお願いします。

    • ベストアンサー
    • Perl
  • 1秒未満間隔のファイル更新について

    皆様 下記のようなプログラム(Perl)で、1秒未満のファイル更新を試みております。sleep(1)として、待ち時間を1秒とすると、data.txtに時刻が更新されますが、sleep(0.8)、sleep(0.5)等として待ち時間を1秒未満にすると、プログラムは動作するのですが、data.txtはファイルとして作成されません。 これは、printf()関数のバッファリング、及びフラッシュに関する仕様に起因するものと思われますが、1秒未満の間隔でdata.txtを更新して時刻をdata.txtに書き込む処理は可能でしょうか? #強制フラッシュの"$| = 1;"を使い、sleep(0.8)としても駄目でした。 すみませんが、よろしくお願いします。 (コード) #use Time::HiRes; #$| = 1; while(){ ($sec, $min, $hour, $day, $mon, $year) = localtime(time); open(OUT, "> data.txt"); printf(OUT "%2s:%2s:%2s\n", $hour, $min, $sec); close(OUT); sleep(1); }