2012-02-26 55 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