• ベストアンサー

サーバに負担をかけずに複数のファイルを開きたいのですが

複数のファイルを順番に開いていきたいのですが(その際、FLOCKを利用したいのですが)、サーバにかなりの負担がかかってしまうようです。負担がかからない方法などがありましたら、教えていただけると大変助かります。何卒よろしくお願いいたします。 具体的には、以下のように記述しているのですが、(素人の根拠のない思いつきで申し訳ありませんが)例えば、1行目の「for($k=1;$k<=15;$k++){」のあとに、「sleep」を入れると、少しは負担が軽くなるものでしょうか? もしも効果があるならば、何秒ぐらいが適当でしょうか? for($k=1;$k<=15;$k++){ #以下の作業を15回繰り返します $file="$k".".dat"; #ファイル名(1.dat~15.dat)指定 open(FILE, "$file"); #ファイルを開く eval{flock(FILE, 2)}; #ファイルロック $/ = ''; $tmp = <FILE>; #ファイル内データを$tmp入れる $/ = "\n"; close(FILE); #ファイルを閉じる } ちなみに、ファイルからデータを読み出すだけでなく、データを書き込むことも頻繁にあるため、ロックしている時間はできるだけ短くしたいと考えております。 何か良い方法がありましたら、教えていただけるとありがたいです。よろしくお願いいたします。

  • CGI
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
回答No.3

さして差は無いようにも思います。 結局、ファイル操作の回数は変わりません。 (むしろsleep分が増えてしまいますよね) ファイルの開け閉めよりも、 ファイル内のデータの容量の方が重要だと思います。 ($tmpにコピーする分の負荷) それがよほど大量で無ければ、 それほど気にされることも無いと思いますけれども。 #全体をflockしなくていいのかがふと気になります #(余計なことでしたらすみません)

oomiyaji
質問者

お礼

お礼が遅れて申し訳ありません。アドバイスいただきありがとうございました。大変感謝しております。データ容量を減らすように、工夫してみます。 ちなみに、個々のファイルをロックしている時間をできるだけ短くする目的で(できるだけ早く開放したかったので)全体をflockしなかったのですが、やはり何回もflockを繰り返すのは、サーバへの負担がかなり増えることになるでしょうか。

その他の回答 (2)

  • rara_sun
  • ベストアンサー率50% (271/539)
回答No.2

> ファイルを連続して開閉し続けるのに比べれば負担が軽くなるでしょうか? 基本的には、軽くなります。

oomiyaji
質問者

お礼

アドバイスいただきありがとうございました。大変助かりました。

  • rara_sun
  • ベストアンサー率50% (271/539)
回答No.1

気持ちSleepをしてあげると、CPU負荷時間およびHDDアクセス負荷が軽減されると思います。 どの程度の維持間が良いかは、試行錯誤だと思いますよ。 Sleepの目安の一般的なデータはないはずです。 (PCのスペックにより、システムの利用状況により、ETCで変わりますよね?)

oomiyaji
質問者

お礼

アドバイスいただきありがとうございます。 sleep自体もサーバに負担をかけるのでは?とも思い、使用するかどうか迷っていたのですが、ファイルを連続して開閉し続けるのに比べれば負担が軽くなるでしょうか?

関連するQ&A

  • データファイルからのデータの取得方法

     たびたびの質問ですみません。  初心者のため文法が理解できていないのか、今度はデータの読み込みでうまくいきません。  記述中のcgiファイルと同じディレクトリにdata.datというファイルがあり、そのファイルには三行のデータが記述されています。  内容は下記の内容です。 ---以下から--- 2006,03,18,,1800,グランド代,鈴木,公園,練習 2006,03,19,1500,,部費,加藤,#1鈴木,2006年度 2006,03,25,1500,,部費,加藤,#2太田,2006年度 ---以上まで---  このデータを各変数に割り当てたいのですが、うまくいきません。  下記のように記述していますが、いかがなモノでしょうか? ---以下から--- $fileline = 0; open FD, "<data.dat" || die $!; while (<FD>) { $fileline++; } close FD; open(FILE, "<data.dat") or printErrorPage("データファイルが開けません。"); eval{ flock(FILE, 1); }; @data = <FILE>; close FILE; for($k=0; $k<$fileline; ++$k){ ($year,$month,$date,$in,$out,$mono,$member,$etc1,$etc2) = split(/\,/, $data[$i]); $totalin = $totalin + $in[$k]; $totalout = $totalout + $out[$k]; } $totalinout = $totalin - $totalout; ---以上まで---  最終的に$totalinには1500と1500が足されて3000と入って、$totaloutには1800と入って、$totalinoutには3000から1800が引かれて1200と計算されるようにしたいのです。

    • ベストアンサー
    • Perl
  • file()を使う時のファイルロック

    たいていの場合は問題ないのですが、 アクセスカウンタ等の更新の激しい物の場合、 file()やfile_get_contents()でファイルを開き、 その内容を元にfopen()・flock()・fputs()等を使って書き込むと、 データが破損してしまう事があります。 これはロック中でもfile()等では開けてしまうのが原因だと思いますが、 file()等を使う際の排他処理はどのようにしたら良いのでしょうか。 ロック中は、fopen()の前で解放されるのを待つ仕様なようなので、 $fp=fopen("ロック用ファイル","r"); flock($fp,LOCK_EX); ~複数のファイルの読み書きを含めた、様々な処理~ fclose($fp); としてみたのですが、これで排他処理は完璧になるでしょうか? これまでは、 1. ロック用ファイルが存在する場合、なくなるまでsleep() 2. 空のロック用ファイルを作成 ~複数のファイルの読み書きを含めた、様々な処理~ 3. ロック用ファイルを削除 としていたのですが、これでは度々破損してしまいました。 「1」と「2」の間で、新しいプロセスが「1」に割り込んで来てしまうせいでしょうか。 そうだとすれば、fopen()とflock()の間でも 同じ事が起きてしまう気がするのですが、どうなんでしょうか。

    • 締切済み
    • PHP
  • ファイルを開いたままオープンモードを変更したい

    $fp = fopen ($file, "r"); flock ($fp, 2); で開いたファイルをロックを解除しないままファイルを空にして書き込みモードに移行する方法を教えてください。 或いは $fp = fopen ($file, "r+"); flock ($fp, 2); からfputs()で書き込んだ後にファイルのファイルポインタ以降の部分を切り捨てる形でも良いです。 flock ($fp, 2);の後にfgetsによりファイル内容を取得した後ファイルロックをしたままファイルの余計な部分を捨てたいので $fp = fopen ($file, "w"); flock ($fp, 2); や $fp = fopen ($file, "r"); flock ($fp, 2); fgets ($fp); flock ($fp, 3); fclose ($fp); $fp = fopen ($file, "w"); flock ($fp, 2); は必要ありません。

    • ベストアンサー
    • PHP
  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP
  • open中のファイルをrename

    オープン中のファイルをflockによる排他をしたままrenameしたいのですがどうもうまくいきません。 sysopen(LOCK, "$file", O_WRONLY);   もしくは open(LOCK, "> $file"); flock(LOCK, 2); rename($tempfile,$file); close; close前にrenameするとロックが外れてしまいます。 close後にrenameをするとやはりロックが外れた状態でのrenameになります。 renameするファイル以外にflock専用ファイルを固定で一つ用意すれば簡単なのですが openしたいファイル数は相当な数があり、各ファイルごとにロックをかけたいのです。 全ファイル分のflock専用ファイルを用意するか、排他方式をmkdirにする以外 何か良い手立てはございますでしょうか。

  • C言語でファイルを出力

    ファイルの中に変数をいれて複数のファイルをつくろうとしたのですが、 できたファイルの後に?マークがついてきます。 file = fopen("filename.txt", "w"); for(j=0; j<30; j++){ fprintf(file ,"%d.dat\n",j ); } fclose(file); file2 = fopen("filename.txt", "r"); として、ファイル名を書いたファイルをつくってから、 for(k=0; k<30; k++){ fgets(fp,sizeof(fp),file2); file_out = fopen(fp,"w"); 省略 fprintf(file_out, %e %e \n",a ,b); fclose(file_out); } fclose(file2); をして、30個のファイルを出力すると、 0.dat? 1.dat? 2.dat? . . . 29.dat? というファイルができてしまいます。 ファイルの中はしっかりできています。 なにか解決法を知っている方がおりましたら、どうか教えて下さい。

  • ファイルの読み込みについて

    いつも大変お世話になっています。 例えば以下のような関数があったとします。 function out_file($file_path) { $_handle = @fopen($file_path, "r"); $_dat = @fread($_handle, @filesize($file_path)); @fclose($_handle); return $_dat; } 【質問1】 $file_path の示すファイルが 10M のファイルだとして、10人のクライアントがアクセスしてきたとしたら、サーバーのメモリは 100M 食われてしまうのでしょうか?それとも10M?(まさか、0M?) 【質問2】 ファイルは読み取り専用で開いていますが、大量のクライアントが同時アクセスしてくるとしても flock など無くて正常に動くのでしょうか? それとも、やはり排他制御する必要はあるでしょうか? 10人同時アクセス時のこの関数の挙動がイマイチイメージできません。 以上です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVを使ったパスワード変更処理について

    CSVを使ったパスワード変更処理について 以下のソースをどういじれば変更が可能か申し訳御座いませんが、 どなたか分かるかたご教授願いますでしょうか? $post = $_POST; $org_file=fopen("logindata.csv","r"); $tmp_file=fopen("guest.tmp","w+"); flock($org_file,LOCK_SH); flock($tmp_file,LOCK_EX); $line =date("Ymd-H:i:s").","; $line.=$_POST['mail'].","; $line.=$_POST['pw2'].","; fputs($tmp_file,$line."\n"); while($row=fgets($org_file,1024)){ if($temp[1]==$post['mail'] && $temp[2]==$post['pw']){ } else{ fputs($tmp_file,$row); } } flock($tmp_file,LOCK_UN); flock($org_file,LOCK_UN); fclose($tmp_file); fclose($org_file); unlink("logindata.csv"); rename("guest.tmp","logindata.csv"); echo "パスワード変更しました。"; exit;

    • 締切済み
    • PHP
  • flockのタイミング

    掲示板のスクリプトを作っています。 ログは1行ごとに1記事分のデータが格納されているので、書き込み処理の場合は、 $lines = file("./log.dat"); としていったん配列にログを読み込み、 array_unshift($lines, $new_data); 等して、新しい記事のデータを配列の先頭に追加し、 $fp = fopen("./log.dat", "wb"); foreach ($lines as $line) { fputs($fp, $_); } fclose($fp); として、最終的にログに書き込みます。 Perlを扱っているときは(複数更新すべきログファイルがあったので)、別途ロックファイルを作ってそれに対してflockをかけるという方法を行っていましたが、今回はログファイルが1つであるのでそのログファイル自体にflockをかけようと思っています。 しかし、fileで最初にopenしているため、ファイルポインタが取得できず、flockをかけるタイミングは、本当の書き込み作業の部分(fopen)からかけるしかなさそうなのですが、これは危険ではないでしょうか? それと、マニュアルに、 注意: flock()は、ファイルポインタを必要とするため、 (fopen()へ引数"w"または"w+"を指定して)書き込 みモードでオープンすることにより丸めるファイルにアクセス保護する 特別なロックファイルを使用する必要があるかもしれません。 とかいてありますが、この意味がいまいちわからず、困惑しています。

    • ベストアンサー
    • PHP
  • open() で開くだけで破損するか

    open(DB,"$file") ;でデータを開くだけでデータが破損することはありますか? たとえば open(DB,"$file") ; flock(DB,2); @lines = <DB>; close(DB); flock(DB,8); のように@linesにデータを格納します。 $fileに上書きはしません。 上記ファイル操作だけで、同時接続があったときにファイルが破損することはありますか? ファイルロック関数を付けた方がいいですか?