perlのreadコマンドで変数に読み込まずに捨てる方法

このQ&Aのポイント
  • perlのreadコマンドを使って超でかいファイルを途中までの分(1G分)を一気に読み進めて途中から処理を進めたいです。
  • readに結構時間がかかるため、変数に読まずに1G分のデータをそのまま捨てて、高速化をはかることは可能でしょうか?(UNIXの/dev/nullに出力するみたいなイメージで。)
  • 詳細なコードは提供されていませんが、readコマンドでファイルを一気に進めた後は、読み進めたところから処理を進めることができます。
回答を見る
  • ベストアンサー

perlのreadコマンドで変数に読み込まずに捨てる方法は?

perlのreadコマンドを使って超でかいファイルを途中までの分(下例では1G分)を一気に読み進めて途中から処理を進めたいです。 処理は下記コーディングで問題なく出来ているのですが、4行目のreadに結構時間がかかります。大量サイズを扱うのでしょうがないのかもしれないですが、もしかしたら、変数$bufに読み込まむから時間がかかるという部分があるなら、変数に読まずに1G分のデータをそのまま捨ててて、より高速化をはかることは可能でしょうか?(UNIXの/dev/nullに出力するみたいなイメージで。) +1|open (my $if, "< test.dat"); #超でかいファイルを開く +2|binmode($if); +3|my $buf; +4|read $if,$buf,1000000000; #--- 1G分、一気に進める +5|#--- 以降、読み進めたところから処理を進める。 ・・・

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.1

seek関数を使ってファイルポインタを進めればいいと思います。 あと、大きな数値にはアンダースコアを入れれば見やすくなります。 read $if,$buf,1000000000;    ↓   ↓変更 seek $if, 1_000_000_000, 0;

yamadandan
質問者

お礼

教えていただいた方法に変えたら、みちがえるほど高速化しました。 助かりました。誠にありがとうございます。

関連するQ&A

  • PerlのソースをPHPに移植中なのですが...

    下記のようなperlをPHPに移植しようと考えています open( FHDR, "<$filename") || return; binmode( FHDR); if ( read( FHDR, $buf, 2) != 2 ) { close(FHDR); return;} if ( 0xffd8 != unpack("n", $buf)) { close(FHDR); return;} if ( read( FHDR, $buf, 10) != 10 ) { close(FHDR); return;} ( $marker,$size,$ext) = unpack("nna6",$buf); ...続く このなかでの最後の行 unpack()がさっぱりわからず 特に"nna6"が何を意味するのかわかりません。 PHPにもunpack()がありますが、やはり意味が解りません。 Perlとも少し動きが違うような... どなたか unpack("nna6",$buf) の意味、 "nna6" の意味、 そしてPHPに移植する場合どう書くのか? 教えてください! よろしくお願い致します!

    • ベストアンサー
    • Perl
  • perlの構文間違いについて

    以下のような、perlの構文で$infoをmyスコープで宣言しつつ、$datという変数が真なら$infoに$datが入ることを期待しているのですが、まちがっているのでしょうか? my $info = $dat if ($dat); よろしくお願いします。

    • ベストアンサー
    • Perl
  • ddコマンドについて

    % dd if=/dev/zero of=zero.dat count=1000 ⇒ 512*1000 バイトの zero.dat が生成される % dd if=/dev/zero of=zero.dat count=2048 bs=1 ⇒ ブロックサイズを 1 に指定。2048 バイトの zero.dat が生成される http://x68000.q-e-d.net/~68user/unix/pickup?dd とのことですが、では/dev/zeroが50バイトだった場合ファイルサイズはどのようになり、もし増えた分はなにが中に入っているのでしょうか。 ご存知の方、アドバイスをお願いします。

  • Perlで画像のサイズ取得する方法

    URL指定で画像サイズの取得が出来ません。 何方かご教授お願いします。 悲しいことにレンタルサーバーにはimage::magickがインストールされていないので使えません。 ----perl---- #!/usr/bin/perl $FileName = "http://i.yimg.jp/images/main11.gif"; ( $format, $width, $height ) = &GetImageSize( $FileName ); print "Content-type: text/html\n\n"; print <<"HTML"; <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <BR> $width x $height <br> <IMG src="$FileName" border="0"> HTML sub GetImageSize{ my ( $IMG, $in ) = @_; my ( %SHT, %LNG ); my ( $buf, $mark, $type, $f_size, $width, $height ); my ( $TAG, $TYPE, $COUNT, $V_OFFSET, $PK, $ENTRY, $Exif_IFD ); my ( $endian, $dummy1, $dummy2, $dummy, $EOI, $APP1, $length, $exif ); my ( $format, $offset, $line, $CODE, $jfif ); my @TGA; my $ntag; # 定数 $mark = pack("C", 0xff); %SHT = ( 'II' => 'v', 'MM' => 'n' ); %LNG = ( 'II' => 'V', 'MM' => 'N' ); # 初期値 $endian = ''; $width = -1; $height = -1; $format = ''; $Exif_IFD = -1; if( $in eq '' ){ $in = 'IMG'; } open( $in, $IMG ) || return( '', -1, -1 ); binmode($in); seek( $in, 0, 0 ); read( $in, $buf, 6 ); # GIF 形式 if($buf =~ /^GIF/i){ $format = 'GIF'; read( $in, $buf, 2 ); $width = unpack("v*", $buf); read( $in, $buf, 2); $height = unpack("v*", $buf); } close( $in ); return( $format, $width, $height ); } exit;

    • ベストアンサー
    • Perl
  • read()メソッドを使ったループの抜け方

    通信のプログラムを作っています。 送信側では、指定した数のバイトデータを作成し、送信します。 受信側では、そのバイトデータを受信して、受信にかかった時間を計測します。 送信側では、次のようにしてデータの最後の文字をsとして、作っています。 受信側では、sを読み込んだら、受信完了と見なし、受信処理を終了します。 送信と受信処理のコードを見てください。 送信側(Dataは指定したバイトデータの数値です) for (int i = 0; i < Data-1; i++) {   out.write(i);   out.flush(); } out.write('s'); out.flush(); 受信側 while((part = in.read(buf,0,buf.length)) != -1) {   total += part; } 受信側のコードだと、送信されたバイトがすべて読み込んだらループを抜けるのですが、 そうではなく、sを読み込んだらループを終了させたいのです。 read(buf,int,int)の戻り値を使って受信されたバイト数を確認したいため、 どうしてもread(buf,int,int)を使って受信したいのです。 read(buf,int,int)を使いつつ、送信バイトの最後の文字sを読み込んだら ループを抜けるようにするには、どうすればよいでしょうか? アドバイスをお願いします。 自分で考えたコードを載せます。 読み込んだバイトをbufに入れる。 そして読み込んだバイト数を合計する。 bufの最後の文字がsならループを抜けるというようにしたいのですが、 指定したデータ分を読み込みません。 for(;;){ part = in.read(buf); total += part; if(buf[total] == 's'){ break; } } こちらの方も、指導していただきたいです。

    • ベストアンサー
    • Java
  • Perlコマンドの引数の中で変数を使う方法

    教えてGooやGoogleで検索してみましたが、ピンポイントでヒットするものが見当たらなかったので、質問させていただきます。 シェル(Cシェル)の中で、以下のコマンドを記述しているのですが、置換前文字列、置換後文字列にシェル内で定義した変数を使いたいです。 --- perl -i -pe 's/置換前文字列/置換後文字列/g' ファイル名 具体的には、テキストファイルの中に 10/24 AAAAAAAAAA 10/25 AAAAAAAAAA //10/26 AAAAAAAAAA //10/27 AAAAAAAAAA //10/28 AAAAAAAAAA //10/29 AAAAAAAAAA //10/30 AAAAAAAAAA というように、日別のスケジュールを記載しています。 未来日については、上記のように//でコメントアウトしています。 日次でシェルを実行して、翌日分のコメントアウトを外すような処理を実施するのが目的です。 setenv DATE1 `date -v +1d +%m/%d` で翌日日付を変数に入れており、DATE1変数を使用して実現したいと思っています。 どうしてもシェルの変数がうまく読み込めず、うまくいきません。 解決方法、ご存知の方がいらっしゃれば、ご教授ください。 よろしくお願いします。

  • read関数で読み込んだ内容をファイルに書き込めない

    バイナリ、asciiのファイルの一部を読み込み、ファイルへ書き出したいのですが、ファイルへ書き出しが上手くいきません。 以下、一部です。 open(FH,$c_file); binmode FH; open(CTFH,">$cd_tmp"); binmode(CTFH); if($i == 1){ $result = read(FH,$cd,677); print $result."\n"; print CTFH $cd; print $cd; } 後でcloseしています。 677byteまでをCTFHに書き込みたいのですが、書き込めていません。 実行した際にprintで$resultには677が出力され、$cdも同様に 677byteの内容が実行時に出力されます。 ちなみにCTFHのファイルは作成されますが0byteと いう形で何も書き出されていない状態になっています。 どうしてなのかわからず煮詰まっています。 アドバイスをください。

    • ベストアンサー
    • Perl
  • ddコマンドの使い方

    こんにちは、 テスト環境のフルバックアップに挑戦しており /dev/hda(テスト環境os)150G(使用10Gほど) /dev/sda(コピ先)80G と、容量の異なるふたつのハードディスクがあり /dev/hdaのテスト環境osを /dev/sdaにコピーしたいと考えています。 シングルユーザーモードで、 dd if=/dev/hda of=/dev/sda で試して見たのですが、一時間しても終わらなかったので 強制終了して/dev/sdaの中身を見てみたら いろいろとファイルが 出来上がってはいたのですが、ファイルサイズは小さすぎる気がしました。 コマンドはこれで正しいのでしょうか?

  • 変数を保持して呼び出す方法

    変数を保持する方法 2022/02/10 15:36 変数が受け継がれない 2022/02/10 15:24 sub A(),subB()と複数のプロシージャをModule1に配置。 Sub Aでターゲットファイル(T_File)を指定して Sub Bで同じT_Fileを呼び出そうとしたのですが Subの前に配列は宣言しているのでPrivateのハズなのに 変数が受け継がれません T_Fileが”””となります。 多分、Sub A()が終了した時点で一度マクロが終了して 新たにSub B()を呼び出すので上手く変数が受け継がれないのだと思います。 何処かのシートのセルに変数を保持して呼び出す方法が考えられますが そのほかに変数を保持する方法は有りませんか? (できればシートのセルに保持しない方法があれば教えて下さい。) 以下コード(コードが長いので必要と思われる所だけを記載しています。) ’------------------------------------ Option Explicit Dim dlg As FileDialog Dim T_File As String Sub A() Set dlg = Application.FileDialog(msoFileDialogFilePicker) If dlg.Show = False Then MsgBox "処理はキャンセルされました。" Exit Sub Else End If '指定テキストファイル読み込み T_File = dlg.SelectedItems(1) '(途中のコード省略) If rc = vbNo Then MsgBox "処理を中止します。", vbCritical Exit Sub Else MsgBox "処理が終了しました。", vbInformation End If End Sub Sub B() ’T_File = dlg.SelectedItems(1) Folder_Name = CreateObject("Scripting.FileSystemObject").GetParentFolderName(T_File) End Sub

  • Perlのmyとourについて

    myとourの違いが、飲み込めません。 以下、当方の環境とします。 【コード(1) ファイル名は read.pl とする】 #!/bin/perl use strict; use warnings; my @filelist = <abc*.log>; foreach my $i (0 .. $#filelist){ open(IN, "$filelist[$i]"); my @alltxt = <IN>; sub f_readlines { my $export=0; foreach my $strings(@alltxt){ $export .= $strings; } return $export; } 【コードの説明と前提】 これは、read.plを実行すると、同じディレクトリにある、「abcで始まり .logで終わるファイル」のすべてを引数として、 同じ処理を繰り返すコードです。 実行時のカレントディレクトリには、abc001.log、abc002.log、abc003.logという3つのファイルが存在します。 abc001.log には aaaaaaa という文字列が書き込まれています。 abc002.log には bbbbbbb という文字列が書き込まれています。 abc003.log には ccccccc という文字列が書き込まれています。 【コード(1)の実行結果】 $ ./read.pl aaaaaaa aaaaaaa aaaaaaa 【現状と当方の考え】 このコードの本来の目的は、存在するファイルの数だけ、その中身を順次読みだす、というものです。 ですので、コード(1)の実行結果は $ ./read.pl aaaaaaa bbbbbbb ccccccc になってくれないといけないのです。 しかし、 my @alltxt = <IN>; の行を our @alltxt = <IN>; に書き換えると、うまくいきました。 ネットを見ていると、myはスコープの範囲が限定的で、ローカルな変数のようで、 グローバル(どこでも変数として取り出せる)なものが our、というように読み取れます。 foreach の処理の中で宣言した my @alltxt ですから、 ファイルの数だけ、毎回 @alltxt の中身の値は変わるはずです。 それが、変わってくれず、初回に@alltxtに読み込んだ aaaaaaa だけが、ファイルの数だけ 出力されてしまいます。 【質問したいこと】 (1)myを使って代入した変数の中身は、同じスコープ内で作成した関数からは読みだせないのか? (2)それならば、なぜ初回のaaaaaaaは、読み出せているのか? 以上よろしくお願いします。

専門家に質問してみよう