【发布时间】:2012-02-12 13:04:58
【问题描述】:
我有一个要在循环中追加的数组:
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 以上的峰值,序列化对象大小刚刚超过 8 MB。现在,这并没有什么帮助,因为我只是在处理一个数据样本,而且这可能会变得更大。
无论如何,您对优化这种情况的任何想法都会很棒。
【问题讨论】:
-
你说你对取消设置很小心——你是在释放你的 mySQL 结果吗?如果你做得足够多,这也会吸走内存。
-
我现在没有在 SQL 中存储任何东西。我只是问那是否是一条更好的路线。但是在获取数据时有一些 sql 查询,为了释放它们,我使用 unset($result) 其中 $result 保存结果集
-
我从没这么说过。我的意思是使用
mySQLi_Result::Free()之类的东西或您使用的任何东西 - 不确定 unset() 是否会完全释放您请求中的内存。