2012-02-12 100 views
0

我有我追加到在一个循环数组:PHP内存耗尽 - 数组或sql?

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

你说你正在小心不关心的东西 - 你是否释放了你的mySQL结果?如果你做得足够多,这往往会吸引记忆。 – Westie 2012-02-12 13:16:59

+0

截至目前,我没有在SQL中存储任何东西。我只是问这是否是一条更好的路线。但有一些SQL查询获取数据,并释放他们我使用未设置($结果)其中$结果保存结果集 – 2012-02-12 14:01:26

+0

我从来没有说过。我的意思是使用'mySQLi_Result :: Free()'或其他任何你使用的东西 - 不确定unset()是否会完全释放你的请求中的内存。 – Westie 2012-02-12 14:30:10

回答

0

对于5MB的数组,PHP肯定不会使用100MB。

使用http://it.php.net/memory_get_usage在脚本中看到它的增长

考虑我建立的条目数百万(200万)PHP数组没有问题。 (内存使用量少于200MB)

+0

是的,这就是我认为的一个5MB的序列化对象,不占用100MB的内存。我一直在使用memory_get_usage来试图解决这个问题,而且它似乎随着我添加到数组中而增长。困惑于这一个。 – 2012-02-12 14:04:02

+0

下面是一段代码:http://pastebin.com/8M1Dk73E – 2012-02-12 14:09:30

+0

它有相当难以令人信服的自动换新线 – dynamic 2012-02-12 14:56:56

-2

使用几兆字节数据的序列化数组作为“排序缓存”显然是个坏主意。

+0

缓存的大阵列没有任何问题:它甚至可能会提高性能。 – RobinUS2 2012-02-12 13:18:11

+0

谢谢罗宾。想要缓存数据的主要原因是不必在每次加载页面时都执行所有远程过程。所以通过在本地缓存数据......好吧,只需要 – 2012-02-12 14:35:18

+0

@ RobinUS2哦,当然没有错。除了消耗大量的内存和解析hellovalot :) – 2012-02-12 15:32:06

0

我发现,如果你使用的是foreach循环,通过像这样的列表迭代你:

foreach($list AS $value) 
{ 
    $list[] = trim($item); 
} 

可以潜在地无限增加$list的大小,从而导致无限或接近无限循环。当带有循环的脚本消耗更多的内存时,它应该,它通常是由一个循环造成一个列表太大而无法处理的内存。