如何解决 PHP For loop IN 内存问题

Posted

技术标签:

【中文标题】如何解决 PHP For loop IN 内存问题【英文标题】:How to solve PHP For loop INF memory problem 【发布时间】:2021-08-22 22:06:57 【问题描述】:

这段代码的问题是,在执行for循环时,内存使用量不断增加。例如,当我使用较小的 $seq_limit 1000 运行代码时,它会完美执行。但是当代码以 1500 的 $seq_limit 值运行时,它会返回 INF。我能做些什么来解决这个问题?下面是我的代码。

<?php

class fibonacci 

    private $seq_limit;
    private $sequence = array(1,2);
    private $even_values = array();
    private $sum_even;

    public function __construct(int $seq_limit)
    $this->seq_limit = $seq_limit;
    
   
    public function fibonacci_sequence()
       for ($i=0; $i<=$this->seq_limit-3; $i++)  
        $this->sequence[] = $this->sequence[$i] + $this->sequence[$i+1];
        
       return $this->sequence;
    

    public function even_values()
        foreach ($this->fibonacci_sequence() as $value) 
            if ($value % 2 == 0) 
                $this->even_values[] = $value;
            
        
        return $this->even_values;
    

    public function sum_even()
        foreach ($this->even_values() as $value) 
            $this->sum_even += $value;
        
        return $this->sum_even;
    

 


 $fibonacci = new fibonacci(1500);
 echo $fibonacci->sum_even();

 ?>

【问题讨论】:

【参考方案1】:

即使您以不耗尽内存的方式实现此功能,第 1500 个斐波那契数也是 1.355E313。那是一个有 314 位数字的数字。最大可表示的双精度浮点数大致为1.8E308。如果你想超越这个范围,你将需要使用像 BCmath 这样的特殊库来处理这么大的数字。不会很快。

也就是说,要生成斐波那契数列,您唯一需要知道的是最后两个数字是什么。你的记忆在不断增加,因为你在不断地增加它。

或者,使用简单的生成器函数:

function fib_gen() 
    yield 1;
    yield 1;
    
    $state = [1,1];
    $offset=2;
    
    while(true) 
        $v = array_sum($state);
        yield $v;
        $state[$offset % 2] = $v;
        ++$offset;
    


$c = 1;
$sum = 0;
$sum_even = 0;

$start = microtime(true);

foreach(fib_gen() as $f) 
    // printf("%4d: %d\n", $c, $f);
    $sum += $f;
    if( $c % 2 == 0 )  $sum_even += $f; 
    if( $c++ >= 1000 )  break; 


$end = microtime(true);

printf("     sum: %s\nsum_even: %s\nduration: %f ms\npeak mem: %d kB\n",
    $sum, $sum_even, ($end-$start)*1000, memory_get_peak_usage() / 1024
);

输出:

     sum: 1.1379692539836E+209
sum_even: 7.0330367711423E+208
duration: 1.071930 ms
peak mem: 416 kB

【讨论】:

以上是关于如何解决 PHP For loop IN 内存问题的主要内容,如果未能解决你的问题,请参考以下文章

解决Dev-C++ [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode

oracle存储过程for in loop的问题

Python for-in Loop常见遍历方法

For loop in bash

For Loop in Worksheet 更改故障

Postgres 函数 FOR IN SELECT LOOP 缩放