如何在PHP中为数组预先分配内存?

时间:2015-09-09 13:49:09

标签: php arrays memory-management

如何在PHP中为数组预先分配内存?我想预先分配351k长的空间。当我不使用数组时,该函数有效,但如果我尝试在数组中保存长值,则失败。如果我尝试使用一个简单的测试循环来填充带有range()的351k值,它就可以工作。我怀疑该数组导致内存碎片,然后耗尽内存。

在Java中,我可以使用ArrayList al = new ArrayList(351000);

我看到了array_fillarray_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;

4 个答案:

答案 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_fillnull(这是我脑子里的黑客),否则你就是不能。

(你可能想检查你对内存的推理。你确定这不是一个XY问题吗?因为内存受数量限制(最大使用量)我不认为碎片会产生很大的影响。检查一下你的记忆是什么,而不是试着沿着这条路走下去)

答案 2 :(得分:2)

正如其他人所指出的那样,你不能用PHP做到这一点(好吧,你可以创建一个固定长度的数组,但这并不是你真正想要的)。但是,您可以做的是增加进程的内存量。

org.jersey.foo.filters

把它放在PHP脚本的顶部,你应该没问题。您也可以在ini_set('memory_limit', '1024M'); 文件中进行设置。这不会为PHP分配1GB内存,而是允许PHP在此时扩展内存使用量。

但有几点要指出:

  • 某些共享主机上可能不允许这样做
  • 如果您正在使用这么多内存,您可能需要了解一下您的工作方式,看看它们是否可以更有效地完成。
  • 寻找机会清除不需要的资源(你真的需要保持包含你已经使用过的巨大物体的php.ini吗?)使用$x

答案 3 :(得分:1)

您将获得的最接近的是使用SplFixedArray。它没有预先分配存储值所需的内存(因为您无法预先指定所使用的值的类型),但它预先分配了数组插槽,并且不需要调整数组本身的大小当你添加值时。