[PHP-users 7381] Re: メモリ使用を最小限に抑えるファイル読み込み

KOYAMA Tetsuji php-users@php.gr.jp
Fri, 10 May 2002 21:30:47 +0900


  小山です。

At Fri, 10 May 2002 19:31:25 +0900,
tonnura@geocities.co.jp wrote:
> 過去にメモリやファイル読み込みについての記事がありますが、
> 色々と役立っております。
> fgetsで指定したバイトが大きければ大きいほど、
> 無駄にバイト確保されてしまうということですが、
>
> $fp = fopen("hoge.txt", 'r');
> while ( !feof($fp) ) {
>   echo fgets($fp, 9182)."<この行はここで終わり>";
> }
> fclose($fp);
>
> 上のように、1行ごとの処理をしたい場合は、
> 行ごとのバイト数にばらつきがあるとかなり無駄にメモリを使ってしまいます。
> そこで、ereg関数を使って\nを探し出し、そこまでで読み込みを終わらせ、
> 次の読み込み処理へ移る…というようなことはできないでしょうか?

  一行が 9KB もあるテキストファイルというのもあまり想像できないので、
何をしたいのかがいまいち分からないのですが、まずは自分でいろいろ考えて
試しにプログラミングしてみるのが第一歩ではないでしょうか?

  あまり効率化してはいませんが、例えばこんな方法を考えてみました。

<?php
define('FILENAME', '/etc/termcap');
define('READ_LENGTH', 100);

$fp = fopen(FILENAME, 'r');
$contents = null;
for (;;) {
  $contents .= fread($fp, READ_LENGTH);
  for (;;) {
    $pos = strpos($contents, "\n");
    if ($pos === false) {
      break;
    }
    $line = chop(substr($contents, 0, $pos));
    echo "&gt;&gt;&gt;$line&lt;&lt;&lt;<br>\n";

    $contents = substr($contents, $pos + 1);
  }    
  if (feof($fp))
    break;
}
fclose($fp);
?>

> 最も効率の良い、1行ごとに処理するファイルの読み込み法を探しています。

  あらゆる場合でも「最も」効率の良い方法など、実際には世の中に存在しま
せんし、それを自ら考えることなく容易に外に求めても、決して答は見つかり
ませんよ。

-- 
	小山 哲志@ビート・クラフト
	koyama@beatcraft.com
	koyama@hoge.org