[PHP-users 8944] Re: FATAL: emalloc(): Unable to allocate とな

Osamu Shigematsu php-users@php.gr.jp
Thu, 25 Jul 2002 16:54:25 +0900


重松です。

> PHPにてテキストファイルを順番に読み集計して表示したいのですが、少し多めの
> ファイルを読み込むと「ページを表示できません」となり Apacheのerroe_logに
>
> FATAL:  emalloc():  Unable to allocate 35 bytes
> FATAL:  erealloc():  Unable to allocate 160 bytes
>
> が残ります。

単純に emalloc(), erealloc() に失敗しているだけでしょう。
通常は、この程度のメモリが割り当てられないはずはないので、
かなりメモリが切迫した状況になっているのではないでしょうか。

それとも、PHP (Apache) って、各 http の子プロセスが使えるメモリに
上限が設けられているなら、それを変更してあげる必要があるのでは。
# こんな状態になったことが私はないので。

そうでないなら、単に実メモリを追加するなり、swap 領域を増やす、
ということになるかと思います。

> while(list(,$name)=each($file_name_arr)){
>     $tmp = @file($name);
>     for($c = 0; $c < count($tmp); $c++) $all[] = $tmp[$c];
> }
>
> count($tmp)がだいたい1000を超えるとエラーが出ます。

ソースを読む限りでは、とっても効率の悪いことをしているように見えますけ。
array を扱う関数を使うと、随分効率よく書けると思います。
while ... each は foreach を使うとか、for ループは array_merge を使うとかです。

$all = array();
foreach($name as $file_name_arr)
	$all = array_merge($all, @file($name));

根本的な解決ではありませんが。

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