[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 メーリングリストの案内