2012-02-26 36 views
1

我需要爲當前項目設置1到2百萬的數組。問題是,我得到一個內存錯誤,當我嘗試執行...PHP無法設置範圍(0,2百萬) - 內存錯誤

編輯:

這對於我已經解決了歐拉計劃問題。但是,我重構代碼的速度要快得多(原始時間爲〜90秒)。

我正在使用eratosthenes篩來標記從0到2mil的素數。 Wikipedia article on this
EndEdit中

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

很明顯,如果這是不行的,代碼的其餘部分將無法正常工作。

任何想法?

P.S.我試過ini_set('memory', '30M');,但那也行不通。

編輯

感謝所有誰指出,該內存將需要更大的比我當初預想。我在ini_set('memory_limit', '4000000000'); //about 3.73 gig

EndFinalEdit

+3

讓我們從頭開始,你想做什麼? – 2012-02-26 20:19:05

+1

爲什麼你需要那麼大的範圍?你想達到什麼目的?可能有更好的方法。 – Ryan 2012-02-26 20:19:09

+1

不知道來源的質量,但在這裏http://pankaj-k.net/weblog/2008/03/did_you_know_that_each_integer.html。暗示它需要68個字節,這意味着你需要超過100MB的陣列。 – Nanne 2012-02-26 20:24:09

回答

0

如果您可以在任意位置設置並從任意索引中獲取數據,則沒有順序數組的點。

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

如果您正在解決這個控制檯歐拉問題(我通常做的),然後用-d memory_limit=4G參數運行PHP文件。它將以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。 – 2012-02-26 21:31:40

0

扔拿在php.ini文件一看解決了這個問題。

有一個設置memory_limit - 這可能會阻止你做這個荒謬的範圍。

0

對於範圍(0,2000000),您將需要超過160M的內存,其中一半將用於範圍(1000000,2000000)。

From php.ini:

;腳本可能消耗的最大內存量(128MB) ; http://php.net/memory-limit memory_limit = 256M