- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个包含大量人员的 PHP 脚本,它通过 SOAP 从外部资源中获取他们的详细信息,修改数据并将其发回。由于细节的大小,我将 PHP 的内存增加到 128MB。运行大约 4 小时后(运行可能需要 4 天)它耗尽了内存。下面是它的基本功能:
$people = getPeople();
foreach ($people as $person) {
$data = get_personal_data();
if ($data == "blah") {
importToPerson("blah", $person);
} else {
importToPerson("else", $person);
}
}
在它耗尽内存并崩溃后,我决定在 foreach
循环之前初始化 $data 并且根据 top
,该进程的内存使用量没有上升到以上7.8% 并且已经运行了 12 个小时。
所以我的问题是,PHP 不会对在循环内初始化的变量运行垃圾收集器,即使重用也是如此吗?系统是否正在回收内存并且 PHP 尚未将其标记为可用并最终会再次崩溃(我现在已将其增加到 256MB,所以我更改了 2 项内容但不确定哪个修复了它,我可能会更改我的返回脚本来回答这个问题,但不想再等 12 个小时让它崩溃才能弄清楚)?
我没有使用 Zend 框架,所以我认为像这样的其他问题不相关。
编辑:实际上我对脚本或它正在做什么没有任何问题。目前,就所有系统报告而言,我没有任何问题。这个问题是关于垃圾收集器以及它如何/何时在 foreach 循环中回收资源和/或系统如何报告 php 进程的内存使用情况。
最佳答案
我不知道 PHP VM 的内部结构,但根据我的经验,它不会在您的页面运行时进行垃圾收集。这是因为它会丢弃页面完成时创建的所有内容。
大多数时候,当页面内存不足且限制相当高(128Mb 并不高)时,就会出现算法问题。许多 PHP 程序员组装一个数据结构,然后将其传递给下一步,迭代该结构,通常创建另一个。起泡沫,冲洗,重复。不幸的是,这种方法会占用大量内存,您最终会在内存中创建数据的多个副本。 PHP 5 中的两个真正大的变化是对象被引用计数,而不是被复制,并且整个字符串子系统变得更快。但这仍然是一个问题。
为了最大限度地减少内存使用,您需要重新构建算法,以便它可以从头到尾处理一份数据。然后你得到下一个并重新开始。最好的情况是您永远不会在内存中拥有整个数据集。对于数据库支持的网站,这意味着处理一行数据,从数据库查询一直到呈现,然后再获取下一个。当然,这种方法并不总是可行的,脚本只需要在内存中保留大量数据。
也就是说,您可以对部分数据执行这种节省内存的方法。诀窍是您在循环结束时显式unset()
一个或两个关键变量。这应该回收空间。另一个“最佳实践”技巧是将不需要在循环中的数据操作移出循环。正如您似乎已经发现的那样。
我运行过需要超过 1Gb 内存的 PHP 脚本。您可以设置每个脚本的内存限制,实际上,使用 ini_set('memory_limit', '1G');
关于php - 垃圾收集器在 PHP 中是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9985030/
引用网址 http://hi.baidu.com/quiteuniverse/blog/item/9f3f043d46ad1e07bba16716.html 以下函数调用方式:&nbs
我什至不确定如何描述我正在尝试做的事情,因为我对 cookie 了解不多,但就这样吧。 是否可以使用PHP从浏览器缓存中收集一个cookie(或cookie文件),将其保存到数据库中,然后清除缓存并重
我正在使用 Room(v. 2.2.1)和协程支持(v. 1.3.2)并进行以下设置 @Entity(tableName = "simple_table") data class SimpleEnti
我正在尝试编写一个基于时间运算符收集/累积值的规则。 rule "Zone6 Overlap" when $i1 : Instance ($e1 : event == " Vel : 20.9
我有一个简单的 BST,定义了节点结构: struct node { int key_value; struct node *left; struct node *right; }; ty
我有这个对象: public class MenuPriceByDay implements Serializable { private BigDecimal avgPrice; p
我正在开发一个应用程序,需要访问给定传感器的“最后 5 秒有值(value)的数据”。我的计划是以某种方式存储这些数据,然后当我请求数据时,它将返回最近 5 秒内获得的所有数据。鉴于以下情况,我不确定
在 Ruby 中,您可以对数组使用 map/collect 方法来修改它: a = [ "a", "b", "c", "d" ] a.collect! {|x| x + "!" } a
我即将开始实时收集大量数字数据(对于那些感兴趣的人,各种股票和 future 的出价/要价/最后或“磁带”)。稍后将检索数据以进行分析和模拟。这一点都不难,但我想高效地做到这一点,这会带来很多问题。我
我提出这个问题是为了寻求有关如何设计系统的实用建议。 像 amazon.com 和 pandora 这样的网站拥有并维护着庞大的数据集来运行他们的核心业务。例如,亚马逊(以及所有其他主要电子商务网站)
假设我们有一个数据数组和另一个带索引的数组。 data = [1, 2, 3, 4, 5, 7] index = [5, 1, 4, 0, 2, 3] 我们想从 index 的 data 元素创建一个
好的,我已经阅读了几个关于它的主题,但现在就开始吧。假设我有一个应用程序,基本上我会时不时地点击一个按钮,几分钟内会发生很多事情,然后它可能会再闲置一个小时,或者可能只是 1 分钟。难道不是在整个结束
我有一个数据框,例如 Seq Chrm start end length score 0 A C1 1 50 49 12 1 B
我正在考虑在 Object[] 数组中收集泛型方法的所有方法参数以进行记录。我知道使用方面可以更好地实现这一点,但是我不允许使用它,并且如果可能的话我正在寻找一种基于纯反射的方法 为了澄清, 假设一个
快速提问: 如果 Socket 对象(及其本地缓存的 InputStream 和 OutputStream 对象)超出范围并被垃圾收集,连接是否在 JVM 中保持打开状态? (即,不会在监听服务器上抛
是否有用于收集 facebook 公共(public)数据作为实时提要的 API。我阅读了关于用于收集数据的公共(public)提要 API,但我现在不能申请,而且它不是免费的,还有 Open str
摘要 :我使用自定义收集器收集给定搜索的所有命中的文档 ID(它使用 ID 填充 BitSet)。根据我的需要,搜索和获取文档 ID 的速度非常快,但是当涉及到从磁盘实际获取文档时,事情变得非常缓慢。
我正在寻找一种方法来从自定义 Gradle 插件收集给定项目的所有依赖约束(通过常规 platform 和/或 enforcedPlatform 和/或“手动”强制执行)。 在 Maven 世界中,您
我有一个 CSV 格式的用户列表,但我需要按广告中的名称从每个用户收集 SamAccount 属性。 CSV 模型 脚本 Get-ADObject -Filter 'ObjectClass -eq "
我得到了一个非常大的列表,其中包含大约 200 个带有文本和图像的项目。 ng-repeat 是一种缓慢渲染的方式。它尝试过这个 solution 。效果很好。但不适合重复收集。 我的网络服务返回此:
我是一名优秀的程序员,十分优秀!