PHP代码内存不足分配问题

时间:2017-12-21 10:22:26

标签: php memory memory-management

有一种技术可以从(N)位代码生成(N + 1)位代码列表。

  1. 按给定顺序获取N位代码列表,并将其命名为List-N
  2. 反转上面的列表(List-N),并命名新的反映列表:Reflected-List-N
  3. 将原始列表(List-N)的每个成员前缀为0,并将此新列表命名为“A”
  4. 将新列表(Reflected-List-N)的每个成员前缀为1并将此新列表称为“B”
  5. N + 1位的代码列表是列表A和B的串联。
  6. 以上步骤的演示:从2位神秘码生成3位神秘码列表

    1. 2位代码列表:00,01,11,10
    2. 反向/反映以上列表:10,11,01,00
    3. 前缀为0:000,001,011,010
    4. 的旧条目
    5. 前缀反射列表1:110,111,101,100
    6. 连接最后两个步骤中获得的列表:000,001,011,010,110,111,101,100
    7. 但是当我输入65作为输入时出错:

      PHP Fatal error: Out of memory (allocated 538968064) in $result[]=$prefix.$value; line code

      :: Code ::

      <?php
      function MysteryCodes($input){
          $initArr=array(0,1);
      
          $list=array();
          $list[0]=$initArr;
          for ($i=1; $i<$input; $i++)
          {
              $prevIndex=$i-1;
              $reflectedListN = array_reverse($list[$prevIndex]);
              $listA=prefixR($list[$prevIndex], '0');
              $listB=prefixR($reflectedListN, '1');
              $list[$i]=array_merge($listA, $listB);
          }
          return array_slice($list[$input-1], -$input);
      }
      
      function prefixR($input, $prefix){
          $result=array();
          foreach($input as $value){
              $result[]=$prefix.$value;
          }
          return $result;
      }
      
      $inp = 5;
      if($inp>=1 && $inp<=65){
          $result=MysteryCodes($inp);
          $output="";
          foreach($result as $key=>$value)
              $output.="$value\n";
      
          echo $output;
      }
      

      还有其他方法可以通过更改相同的代码或逻辑来克服。

      提前致谢。

1 个答案:

答案 0 :(得分:0)

对于$inp = 65,您生成的数组将包含2^65个不同的二进制值。您将每个值存储为字符串,这不是存储二进制数字的最有效方法。您可以将字符串转换为整数以存储在数组中然后返回字符串进行计算(反转,前缀) - 但是您很快会遇到整数溢出 - 对于32位PHP上的大于2^32的值和64位PHP上的2^64 - 请参阅docs - 然后将值转换为float类型,您将失去精确度。

所以你可以将更多的值压缩到内存中,但无论你做什么,你肯定会达到这样的程度,这个数组不适合memory_limit