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

Osamu Shigematsu php-users@php.gr.jp
Sat, 11 May 2002 17:11:26 +0900


重松です。こんにちは。

> <前略>
> | > fgetsで指定したバイトが大きければ大きいほど、
> | > 無駄にバイト確保されてしまうということですが、
>
> 問題なのは「無駄にバイトを確保」することではなく、「"無駄に確保
> されたバイト"が他のプロセスを圧迫する」ことだと思います。
> (前者がYesなら、後者がYesの可能性は高くなりますが、同じこと
>   ではありません。)
> # メモリ容量が、利用用途に対して十分ある(=スワップが発生しない)なら、
> # 別に「無駄に確保」していても僕は気にしません。

実際にそこがボトルネックになってるのかどうかもわからずに、
闇雲に高速化することばかり意識している気がします。

仮にそれがボトルネックだとしても、
メモリが足らなければ、実メモリを追加すればいいし、
処理が遅いなら、速い CPU, HDD を使えばいい、という考え方もありますし。

> | > }
> | > fclose($fp);
> | >
> | > 上のように、1行ごとの処理をしたい場合は、
> | > 行ごとのバイト数にばらつきがあるとかなり無駄にメモリを使ってしまいます。
> | > そこで、ereg関数を使って\nを探し出し、そこまでで読み込みを終わらせ、
> | > 次の読み込み処理へ移る…というようなことはできないでしょうか?
> |
> |   一行が 9KB もあるテキストファイルというのもあまり想像できないので、
> | 何をしたいのかがいまいち分からないのですが、まずは自分でいろいろ考えて
> | 試しにプログラミングしてみるのが第一歩ではないでしょうか?
>
> 賛成に一票。

というか、岸田さんじゃないけど、ereg を使うとかいってる時点で、
速度はどうでもいい、といっているようなものだから、
1 バイトづつよめばメモリ効率最高ですけど、
メモリ使用 10K のカメが 1 秒かけて処理する場合と、
メモリ使用 100K の兎が 1 ミリ秒で処理するのとどちらが効率が良いんでしょうかね。
# それに、なぜに  \n 探しに ereg? strstr, strchr でいいんでは?

ただ、PHP の文字列連結処理で std::string みたいに、
倍、倍でバッファを確保するならば、単純にそうともいえない気がします。

> チューニングって突き詰めていくとバランス(≒割り切り)の問題になるので、
> 利用用途を(プログラミングの視点から)どれだけ明確にできるかにかかって
> いると思います。

で、根本的な問題として、テキストファイルから読み込んだりしないで、
データベース使えばいいんじゃないのかしらと思います。

環境などを書いていないので、何ともいえないんですが。

--
Osamu Shigematsu
mailto:shige@ravi.ne.jp