[PHP-users 20928]Re: csvファイルの読み込み

Seiji Masugata s.masugata @ digicom.dnp.co.jp
2004年 3月 23日 (火) 16:48:58 JST


こんにちわ、桝形です。

返答ありがとうございます。


> > $Str = fgets( $PTR, 1000 )
> > $Str = fgets( $PTR, 100000 )
> > 
> > とかも、結構(確認した時は5秒くらい)差が出ますね。
> 
> 試してみると、かなりの差が出ることが確認できました。
> 結論としては、PHP 4.3.0 以降で fgets() を使用する場合は、第2引数は
> 省略する方が速いようです。

省略すると、無駄な処理を行わないので(パラメータ取得の処理等)
その分、速くなっているのでしょうかねぇ。

	PHP_STREAM_TO_ZVAL(stream, arg1);

	if (argc == 1) {
		/* ask streams to give us a buffer of an appropriate size */
		buf = php_stream_get_line(stream, NULL, 0, &line_len);
		if (buf == NULL)
			goto exit_failed;
	} else if (argc > 1) {
		convert_to_long_ex(arg2);
		len = Z_LVAL_PP(arg2);

		if (len <= 0) {
			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0.");
			RETURN_FALSE;
		}

		buf = ecalloc(len + 1, sizeof(char));
		if (php_stream_get_line(stream, buf, len, &line_len) == NULL)
			goto exit_failed;
	}


PHPAPI char *_php_stream_get_line(php_stream *stream, char *buf, size_t maxlen,
		size_t *returned_len TSRMLS_DC)


等を見ると、パラメータがある場合、色々な計算処理をしているよう
に見えます。


で、こちらも色々と調べてみているのですが、どうも大きなファイル
だと駄目みたいです。


小さいファイルであれば、大きな差は、そこまで出ないようです。
といっても、処理しないだけなので、当たり前と言えば当たり前。


> 以下のように、100万行の数字だけのファイルを作成して、PHP 4.3.5RC4 の
> gets() で読み込みに掛かる時間を調べてみました。

お、詳しく調査してくれてありがとうございます。
参考にします。


> または、メモリに余裕があれば、以下のようにファイル全体を読み込み、正規表現を
> 使用して行を取得するという方法があると思います。
> 
> $ php -r '$s = file_get_contents( "test.txt" ); if ( preg_match( "/^999999,.*$/m", $s, $m ) ) { echo $m[0]; }'

これは考えていたのですが、止めました。
理由としては、卑怯な気がした(同じ条件にならない)からです。(^^;


後、思いつくのは、直接、I/O処理するextensionの作成でしょうか。
時代を逆行するようですが。。。


ただ、やり方次第で、無理にDBを利用しなくても高速に検索できる事を
再認識したので、そういう意味ではチャレンジした甲斐はあったのかな
と思っています(fgetsの事も発見できたし)。

-- 
Seiji Masugata<s.masugata @ digicom.dnp.co.jp>




PHP-users メーリングリストの案内