2012-02-26 5 views
1

私の現在のプロジェクトには1から200万の配列を設定する必要があります。問題は、私が実行しようとしたとき、私はメモリエラーを取得することです...PHPは範囲(0、200万)を設定できません - メモリエラー

編集:

これは、私はすでに解決しているプロジェクト・オイラーの問題のためです。しかし、私はそれをはるかに高速にするためにコードをリファクタリングしています(元の時間は〜90秒でした)。

私はエラトステネスの篩を使って0から2milの素数をマークしています。明らかにWikipedia article on this
EndEdit

<?php 
range(0,2000000); 
?> 

、これは動作しません場合は、残りのコードは動作しません。

アイデア?

P.S.私はini_set('memory', '30M');を試しましたが、それもうまくいきませんでした。

編集メモリは、私が最初の予想よりもはるかに大きいことが必要となることを指摘したすべての人へ

感謝。私は、php.iniファイルの中を見てみましょうini_set('memory_limit', '4000000000'); //about 3.73 gig

EndFinalEdit

+3

始めから何をしようとしていますか? –

+1

なぜあなたはその大きな範囲を必要としますか?あなたは何を達成しようとしていますか?より良い方法があるかもしれません。 – Ryan

+1

ソースの品質はわかりませんが、ここhttp://pankaj-k.net/weblog/2008/03/did_you_know_that_each_integer.html。それは68バイトを要することを意味します。つまり、あなたの配列に100MB以上の方法が必要です。 – Nanne

答えて

0

任意の場所に設定して任意のインデックスからデータを取得できる場合は、順次配列のポイントはありません。コンソールでこのオイラーの問題を(私は通常何をすべきか)を解くしている場合は、その後-d memory_limit=4GパラメータでPHPファイルを実行し

// completely acceptable in php 
$data[2000000] = 2000000; 

。 4 GBのメモリで動作します。

php -d memory_limit=4G /path/to/euler/problem.php 

ところであなたは、あなたがそのような大きさの配列を持っていることを模倣することができますいくつかの魔法のクラスを作成することができます。 :)

class MySuperCoolLongIntArray{ 
    private $data=array(); 
    public get_int($index){ 
     return isset($this->data[$index])? $this->data[$index]: 0; 
    } 
    public set_int($index, $value){ 
     $this->data[$index]=$value; 
    } 
} 
+0

残念ながら、私はコンソールをJavaを実行するように設定しましたが、提案に感謝します。また、私はユーモラスなトーンXDを楽しむ。 –

0

に投げることによって問題を解決しました。

設定はmemory_limitです。おそらくこのばかげた範囲をやめてしまいます。

0

範囲(0,2000000)には160M以上のメモリが必要で、範囲(1000000,2000000)には半分のメモリが必要です。

php.iniから:

;スクリプトが消費するメモリの最大量(128MB) ; memory_limit = 256M

関連する問題