当我在 FuelPHP 中循环创建模型时内存泄漏

Posted

技术标签:

【中文标题】当我在 FuelPHP 中循环创建模型时内存泄漏【英文标题】:Memory is leaking when I create models in a loop in FuelPHP 【发布时间】:2014-07-24 18:03:17 【问题描述】:

我正在运行这样的代码

foreach ($set as $id)

    $user = Model_Users::find($id);
    $user = NULL;

每个循环都会增加内存消耗。太多不容忽视 - 每次大约 300Kb。迭代次数为数十万。

所以,有一个问题 - 我必须销毁或关闭什么来保持内存消耗水平?

【问题讨论】:

实际上,我也注意到在我的一些代码中使用 ORM\Model 时,这种静态方法很慢,这就是为什么我将一些代码改为 DB::methods 类。跨度> 不幸的是,我尝试了一个适当的模型,其中包含has_many、观察者和其他东西。放弃所有这些工作并重新开始将是很遗憾的。速度在这里不是问题。 是的,我也是这么想的,不使用你已经在你的设置中的所有东西(关系、观察者等)是一种浪费。 【参考方案1】:

v1 ORM 缓存每个创建的模型。在循环中执行查询也不是最好的方法,就好像您有“数十万个”您将执行数十万个查询一样。

如果您要同时处理那么多行,您有两种选择。第一个是使用 DB 类来执行您的查询。第二个是一次以较小的批次运行循环。

我还可以建议使用IN 一次加载多个模型,从而将查询从循环中删除。

$users = Model_Users::find('all', array(
    'where' => array(
        array('id', 'IN', $set)
    )
);

【讨论】:

嗯,你的答案唯一相关的部分是第一句话,但没有答案如何关闭它。其余的完全没用。为什么我不能使用 DB 已经在 cmets 中进行了解释,并且在循环中运行根本没有帮助。 简短的回答是您不能轻易将其关闭。如果您使用 ORM 的 Query 对象,您可以使用 from_cache(false) 禁用缓存,或者您可以查看 Model 类的缓存对象属性以手动擦除它们。 github.com/fuel/orm/blob/1.8/develop/classes/model.php#L110 通常不建议将 ORM 用于此类大型数据集,因为水化过程非常缓慢,并且 ORM 提供的抽象通常不需要大量操作。并不是说您的情况就是这种情况。正如我还提到的,您可以查看分页。 再一次 - 速度慢不是问题。该框架有一个命令行实用程序,旨在用于处理大型数据集。除了将通用模型作为数据的通用接口之外,这也是 ORM 理念的基石。如果你不能在需要时使用它,那么拥有一个包含关系、观察者和其他东西的模型有什么意义呢?我只需要关闭这个愚蠢的缓存。我已经做到了,通过清除您指出的这个变量,但恐怕是野蛮的方式。问题是为什么我不能轻易关闭它。 我真的很抱歉回复的严厉,但出于某种原因,你总是试图摆脱这个话题,而是解决不存在的问题。这里太热了,这让我有点不适应。我很抱歉。 不用担心,我们最好的人都会遇到这种情况。没有简单或“好”的方法存在的原因是最初构建代码时根本没有考虑到它。 v1 ORM 不是最好的写法,当你开始想做一些不是为它设计的事情时,它变得非常困难或不可能。通过 v2 重写,这是我们希望解决的问题。例如 v2 中的缓存,如果您想使用 memcache 或 w/e,您可以打开或关闭或完全关闭该功能

以上是关于当我在 FuelPHP 中循环创建模型时内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

动态编程,硬币变化,内存泄漏?

想知道我是不是有内存泄漏(报告为潜在)

C++:OpenMP 并行循环内存泄漏

Tensorflow:即使在关闭会话时内存泄漏?

TensorRT 增加内存使用(泄漏?)

当我在 Thread 对象上调用 run() 时,为啥我的 Java 程序会泄漏内存?