• ベストアンサー

open( ) の読み込み量

kokucho81の回答

  • ベストアンサー
  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.3

>flock(OUT, 2); お使いのOSはWindows98系ですか? Windows98系であれば、flockそのものが使えません。 (flock関数そのものが実装されていない、エラーメッセージでimplements関係のメッセージが出ていればそうです) Windows系で確かめるのであれば、WordかExcelで読みこみファイル “a.dat”を開いておくのが良いです。 あと、読み込み始めると言っても、システムによってロックされているので データをガシガシ読めるわけではなく(それじゃOSが機能してないですね) 1行目の1文字目でEOFが返ります。(少なくとも普通のOSならそうなるはずです) (ファイルは普通はOSが守ってくれます) あとはご自分で調べてください。

A__
質問者

お礼

どうもおかしいと思ったら、Win98 では flock が使えなかったんですね。 実際にアップして実験したら、2つのコメントを 外して、ロックしているのに読み込める というのを確かめることができました。 flock というのはロックのフラグのようなもので それだけではファイルはロックされない。 ファイルに触れさせないためのロックの 処理については、flock でのフラグの値によって 場合分けをし、ロックされていればファイルに 触れさせない処理を書く という方法で本当のロックが実現できるわけですね。 ありがとうございました。 たくさん勉強になりました。

関連するQ&A

  • Perlの省略可能な書き方

    open IN,'log.dat'; $_=<IN>; push(@a,$_); この3行を open IN,'log.dat'; push(@a,<IN>); このように2行に書き換えても文法上は問題ないですか?

    • ベストアンサー
    • CGI
  • 全行読み込むには

    open( IN, "pass.dat" ) or die "Can't open pass.dat: $!"; $f_data = <IN>; close( IN ) or die "Can't close pass.dat: $!"; $f_data1 = $f_data; $f_data2 = $f_data; $f_data1 =~ s/<br>//g; $f_data2 =~ s/\S//g; open( OUT, ">log.dat" ) or die "Can't open log.dat: $!"; select OUT; print "$f_data1"; print "$f_data2"; select STDOUT; close( OUT ) or die "Can't close word.js: $!"; 上記スクリプトでは、pass.datの一行目しか読み込まれません。全行を読み込むためにはどのように書き換えればいいのでしょうか?宜しくお願いします。

    • ベストアンサー
    • Perl
  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • 一行だけ読込

    Perlでのファイルの読込なんですが、 open(IN,"A.txt"); while ($xx = <IN>) { print $xx;} close(IN) とするとA.txtファイルの読込をするんですよね? A.txtの中の一行だけを読込むというのはできるんでしょうか? (10行あったら5行目を読込み、という感じです。)

    • ベストアンサー
    • Perl
  • ファイルから読み込んで配列へ

    PerlでCGIスクリプト(掲示板もどき)を作成しています。 配列の操作がうまくいかず、ご教授頂きたいと思います。 <やりたい事> 1.ブラウザ上のフォームからの入力を、カンマ区切りでテキストファイルに追記して保存。 2.そのテキストの一部を使ってHTMLで表を作る。 <実際の作業> 1.フォームからのデータはcgi-lib.plで連想配列として受け取り、unshiftでテキストファイルへ追記する。 &ReadParse; #フォームからデータを受け取る $o=$in{'name'}; $p=$in{'mail'}; $q=$in{'title'}; $r=$in{'comment'}; open(IN,"xxx.txt"); @tmp1=<IN>; close(IN); #1件1行として新規データを追加する unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n"); open(OUT,">xxx.txt"); print OUT @tmp1; close(OUT); 2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。 データを読み込む時点でつまづき、先に進めません。 <テキストファイルの例> 1行目:a,b,c,d 2行目:e,f,g,h 3行目:i,j,k,l 以下同様 <症状> print @tmp1;とすると、a~lの全てのデータが表示される。 $tmp1[0];とすると、(a)のみ表示される。 $tmp1[1];とすると、カンマ(,)が表示される。 $tmp1[2];とすると、(b)が表示される。 <質問> 一つの行(配列)に対して2回繰り返す処理(nameとtitle)と、行単位で繰り返す処理(1行目、2行目…)を合わせればいいのだろうと思っていますが、どうすればいいのかわかりません。 気分的には↓こんな感じです。 foreach { "行の処理" foreach { "列の処理" } } そもそも、区切り文字であるカンマが、配列に格納されている時点で失敗しているのかな?とも思っています。 宜しくお願いします。 なお、不足している情報がありましたら補足いたします。

    • ベストアンサー
    • Perl
  • データコピー

    unsigned short型の配列から別のunsigned short型の配列へ、データをコピーするときに、オーバーヘッドを少なく、いかに処理時間を高速にデータをコピーするかというお話です。 たとえば↓のようなデータがあったとします。 unsigned short a[100],b[100]; 配列aから配列bへどのようにしたら、高速にメモリコピーできるんでしょうか? memcopyを使用すると一番手っ取り早いのですが、ものすごくオーバーヘッドが高いと聞きます。memcopyを行うとどのような処理をしているのでしょうか? memcpyを使用しないなら、for文を使って for(i=0;i<100;i++){  a[i]=b[i]; } と私はしてしまいたいのですが、知人曰く、メモリアクセスには時間がかかるので避けたいとのことでした。 たとえば、aからbへの代入に一旦ポインタを使用して、double型でキャストして代入を行い、メモリアクセスの回数を減らして、for文のループも減らすという対策も出来るとおもいますが、一体どれが一番高速にaからbへデータをコピーできるのでしょうか? a[100],b[100]としましたが、サイズは任意です。大きい場合もあるし、小さい場合もあります。 なにか良いアイデア&memcopyの内部処理などを知っている方いましたら、教えてください。

  • 配列の値の操作について教えてください

    num.datの内容が 100 200 300 400 500 の時、以下を実行すると open(IN, "./num.dat"); @number = <IN>; close (IN); $number[0] = $number[0] - 10; open(OUT, ">./num.dat"); print OUT @number; close(OUT); 書き出されたnum.datの内容は 90200 300 400 500 のようになってしまいます。これを 90 200 300 400 500 にしたいのですがどうすればよろしいのでしょうか?くだらない質問ですが、何卒ご教授の程よろしくお願い致します。

    • ベストアンサー
    • Perl
  • csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい

    csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい csvデータの開始行と最終行を全体の4分の1で区切り処理をしたいと思ってます。 csvファイルは20万件あります。4分の1なので1~50000件となります。 今回は50001~100000件までを行いたいのですが、先日教えていただいたwhile($lines = <IN>) ですと、最初から1件ずつ最終行まで処理をしてしまいます。 (ここから) open(OUT,">$csv"); open(IN,"$data") || &error(" $data を読み込みopen出来ません"); while($lines = <IN>) { ($seq1,$categ,$password,$imail,$cont) = split("\,", $lines); $cont .= " "; $data = "$seq1,$cont,1\n"; print OUT "$data"; $data = ""; } close IN; close OUT; (ここまで) 今回は20万件ですが、毎回このデータ量は月次ごとに変わります。 while周辺をいじるような気がしていますがどのようになるのかがわからなかったので質問いたしました。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • スプールとは

    入出力の処理に時間がかかる場合にハードディスクに一時的にすべてのデータを書き込んで少しずつ処理させることで、マイクロプロセッサを効率的に利用すること。 と書いてあったのですが要するにこれは入出力処理をいくつかに分割してある程度時間間隔を置いて実行することでCPUが一つの処理に占領されるのを防ぐと言うことでよいのでしょうか?加えてハードディスクに書き込むことはメモリの節約を狙っているのでしょうか?

  • VBAで高速にデータを処理するコツを教えてください

    いつもお世話になっております。 VBAのことで教えて欲しいことがあります。 EXCEL2000 VBAであるデータを処理するコードを作っています。 データ数は1万行×5列×6シート=30万です。 処理する際のパラメータの違いから、この30万個のデータをfor文を使って繰り返し処理します。 繰り返し回数は20万回です。 一回の処理に1秒かかるとすると1秒×20万回なので、2~3日かかります。 このデータを処理する速度の向上を考えています。 L1キャッシュ→L2キャッシュ→メインメモリ→HDD の順に処理速度(アクセス速度?)が遅くなると調べて分かりました。 30万個のデータを配列(メインメモリ?)に格納する方法は下記のようにすればいいと分かりました。 Dim myData as Variant myData = Worksheets("myData").range("A1:E10000") myDataから1行1列目のデータを取り出すのはmyData(1,1)でできると言うことも分かりました。 そこで質問です。 1.コードの記述により、メインメモリよりも高速なL1キャッシュ、L2キャッシュを意識して使うことはできるのでしょうか。 処理している間ずっと30万個のデータをL1,L2キャッシュに格納しておけば、メインメモリに格納しておくよりも高速に処理ができると単純に考えました。 2.私のPCはVista、Core2Quad Q9450、4GB DRAMです。 VBAでは4つのコアをすべて使って実行すること(CPU使用率100%)はできないと聞きました。 上記の処理を実行する時、1つのコアで処理させるのがいいのか、複数のコアで処理させるのがいいのか、プロセスの優先度はどうすべきか、など、コードの記述以外の方法で処理速度を上げる方法はあるのでしょうか。 3.処理速度を向上させるコツなどありますでしょうか。 4.VBA以外の言語なら4つのコアをフルパワーで使えるよ、というのがありましたら教えてください。 (C言語はそれに該当するというのは聞きました。) よろしくお願いいたします。