我有一个我要在循环中追加的数组:
array_push($obj->{$type.'listings'}, $listing);
循环进行一系列远程调用并提取我想要存储在文件中的数据并用作一种缓存。
在运行这个“缓存例程”时,如果我序列化这个数组,它报告只是超过5MB。为了创建5MB阵列,该脚本耗尽了100MB内存。我正在非常小心地取消设置变量来尽可能释放内存。我已经完成了对所有内容的评论,并且通过函数取消注释以查看内存构建的位置。当我推送到阵列时,肯定会发生这种情况。如果我不使用array_push,那么使用memory_get_usage()和gc_collect_cycles()我可以看到一些相当稳定的内存量与一些尖峰一起使用,但它随着它的移动而自行释放。
一旦我推送到阵列,它就会变得疯狂,内存使用量就会增加。
对于如何处理这种情况有什么想法吗?
我不能用PHP构建像这样的大型数组吗?
在构建文件时,有没有办法将数组刷新到文件中?并且假设我可以将其构建并存储在文件中。当我想使用它时,我是否会从文件中提取相同数量的资源....或者内存耗尽正在发生,因为它是在构建时动态添加的?
这是我应该考虑使用SQL的吗?并将循环的每个运行存储在一个单独的行中?
只是为了踢,我添加了:ini_set('memory_limit', '-1');
只是为了看它是否会运行。
确实如此,内存使用率达到了100 MB以上,序列化对象大小刚刚超过8MB。现在,这不是真正有用的,因为我只处理数据样本,这可能会变得更大。
无论如何,任何关于优化这种情况的想法都会很棒。
答案 0 :(得分:0)
对于5MB的数组PHP,肯定不会使用100MB。
在脚本中使用http://it.php.net/memory_get_usage查看其增长位置
考虑我构建了数百万(2百万)条目的PHP数组,没有任何问题。 (内存使用量小于200MB)
答案 1 :(得分:0)
我发现如果你使用foreach循环迭代你的列表如下:
foreach($list AS $value)
{
$list[] = trim($item);
}
您可以无限增加$list
的大小,从而导致无限或接近无限循环。当一个带循环的脚本消耗更多的内存时,它应该是,它通常是由一个循环构建一个太大而无法处理内存的循环引起的。
答案 2 :(得分:-2)
使用几兆字节数据的序列化数组作为“一种缓存”显然是个坏主意。