如何在PHP中为数组预先分配内存?我想预先分配351k长的空间。当我不使用数组时,该函数有效,但如果我尝试在数组中保存长值,则失败。如果我尝试使用一个简单的测试循环来填充带有range()
的351k值,它就可以工作。我怀疑该数组导致内存碎片,然后耗尽内存。
在Java中,我可以使用ArrayList al = new ArrayList(351000);
。
我看到了array_fill
和array_pad
,但是这些数组会将数组初始化为特定值。
我使用了一系列答案。凯文的答案单独起作用,但随着规模的扩大,我希望将来也能防止出现问题。
ini_set('memory_limit','512M');
$foundAdIds = new \SplFixedArray(100000); # google doesn't return deleted ads. must keep track and assume everything else was deleted.
$foundAdIdsIndex = 0;
// $foundAdIds = array();
$result = $gaw->getAds(function ($googleAd) use ($adTemplates, &$foundAdIds, &$foundAdIdsIndex) { // use call back to avoid saving in memory
if ($foundAdIdsIndex >= $foundAdIds->count()) $foundAdIds->setSize( $foundAdIds->count() * 1.10 ); // grow the array
$foundAdIds[$foundAdIdsIndex++] = $googleAd->ad->id; # save ids to know which to not set deleted
// $foundAdIds[] = $googleAd->ad->id;
答案 0 :(得分:3)
PHP有一个带有SplFixedArray的数组类
$array = new SplFixedArray(3);
$array[1] = 'test1';
$array[0] = 'test2';
$array[2] = 'test3';
foreach ($array as $k => $v) {
echo "$k => $v\n";
}
$array[] = 'fails';
给出
0 => TEST1
1 => TEST2
2 => TEST3
答案 1 :(得分:2)
快速回答是:你不能
PHP与java完全不同。
如上所述,您可以创建具有特定值的数组,但您已经了解它们。你可以假装'它通过填充空值来表示,但说实话也是如此。
因此,除非你想创建一个array_fill
和null
(这是我脑子里的黑客),否则你就是不能。
(你可能想检查你对内存的推理。你确定这不是一个XY问题吗?因为内存受数量限制(最大使用量)我不认为碎片会产生很大的影响。检查一下你的记忆是什么,而不是试着沿着这条路走下去)
答案 2 :(得分:2)
正如其他人所指出的那样,你不能用PHP做到这一点(好吧,你可以创建一个固定长度的数组,但这并不是你真正想要的)。但是,您可以做的是增加进程的内存量。
org.jersey.foo.filters
把它放在PHP脚本的顶部,你应该没问题。您也可以在ini_set('memory_limit', '1024M');
文件中进行设置。这不会为PHP分配1GB内存,而是允许PHP在此时扩展内存使用量。
但有几点要指出:
php.ini
吗?)使用$x
答案 3 :(得分:1)
您将获得的最接近的是使用SplFixedArray
。它没有预先分配存储值所需的内存(因为您无法预先指定所使用的值的类型),但它预先分配了数组插槽,并且不需要调整数组本身的大小当你添加值时。