PHP从59元素数字数组生成10元素组合时触发内存溢出报错
59元素数组生成10长度组合的实现问题
基础需求
从包含59个数字的数组中获取所有长度为10的组合,示例原始数组定义为:
$array = [1,10,20,32,12,60,54,90,20,11,2,3,4,5,6,7,8,9,22,33,61,62,69,49, ...];
已尝试的实现方案
类内递归采样实现
对应方法代码:
function sampling($chars, $size = 10, $combinations = array()) { // 首次迭代时,初始组合集与字符集保持一致 if (empty($combinations)) { $combinations = $chars; } // 当递归到size为1时返回结果 if ($size == 1) { return $combinations; } // 初始化数组存储新生成的组合 $new_combinations = array(); // 遍历已有组合与字符集拼接生成新字符串 foreach ($combinations as $combination) { foreach ($chars as $char) { $tmp = $combination . $char; if ($size == 2) { $tmp .= '.com'; } $new_combinations[] = $tmp; // 逻辑存在缺陷的注释代码 //$new_combinations[] = implode(".com", $new_combinations); } } // 递归调用自身进入下一层迭代 return $this->sampling($chars, $size - 1, $new_combinations); }
该实现无重复选取限制、无组合去重逻辑,递归生成的结果规模会随层级指数级膨胀。
Math_Combinatorics 库实现
对应调用代码:
require_once 'Math/Combinatorics.php'; $numbers = [1,10,20,32,12,60,54,90,20,11,2,3,4,5,6,7,8,9,22,33,61,62,69,49, ...]; $combinatorics = new Math_Combinatorics; foreach($combinatorics->permutations($numbers, 10) as $p) { echo join(' ', $p), "\n"; }
运行报错:Fatal error: Out of memory (allocated 20061356032) (tried to allocate 20480 bytes)
该方法调用的是排列生成逻辑,对应计算规模为59个元素中取10个的全排列量级,无内存优化的批量结果加载会直接耗尽可用内存。
已完成的内存配置调整
- 修改php.ini全局配置:
memory_limit=-1 - 脚本内动态覆盖配置:
ini_set("memory_limit", "-1");
补充说明
因采样方法定义在类内部,递归调用时统一使用$this->sampling的写法。
内容的提问来源于stack exchange,提问作者Simone Rossaini
相关产品推荐
相关产品推荐

