- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 StackOverflow 上找到了以下解决方案,可以从对象数组中获取特定对象属性的数组:PHP - Extracting a property from an array of objects
建议的解决方案是使用 array_map
并在其中使用 create_function
创建一个函数,如下所示:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
会发生什么?:array_map
遍历每个数组元素,在本例中是一个 stdClass
对象。首先它创建一个这样的函数:
function($o) {
return $o->id;
}
其次,它为当前迭代中的对象调用此函数。它有效,它的工作原理与类似的解决方案几乎相同:
$catIds = array_map(function($o) { return $o->id; }, $objects);
但此解决方案仅在 PHP 版本 >= 5.3 中运行,因为它使用了 Closure
概念 => http://php.net/manual/de/class.closure.php
现在真正的问题是:
create_function
的第一个解决方案增加了内存,因为创建的函数将被写入内存,不会被重用或销毁。在带有 Closure
的第二个解决方案中,它会。
所以这些解决方案给出了相同的结果,但在内存方面具有不同的行为。
下面的例子:
// following array is given
$objects = array (
[0] => stdClass (
[id] => 1
),
[1] => stdClass (
[id] => 2
),
[2] => stdClass (
[id] => 3
)
)
不好
while (true)
{
$objects = array_map(create_function('$o', 'return $o->id;'), $objects);
// result: array(1, 2, 3);
echo memory_get_usage() ."\n";
sleep(1);
}
4235616
4236600
4237560
4238520
...
好
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
// result: array(1, 2, 3);
echo memory_get_usage() ."\n";
sleep(1);
}
4235136
4235168
4235168
4235168
...
我花了很多时间来找出这个问题,现在我想知道,这是垃圾收集器的错误还是我弄错了?为什么将已创建和调用的函数留在内存中是有意义的,因为它永远不会被重用?
这是一个运行示例:http://ideone.com/9a1D5g
更新:当我递归搜索我的代码及其依赖项时,例如PEAR 和 Zend 然后我经常发现这种BAD方式。
更新:当两个函数嵌套时,我们从内向外进行以评估此表达式。换句话说,它首先启动 create_function
(一次),返回的函数名称是 array_map
的单次调用的参数。但是因为 GC 忘记将它从内存中删除(没有指针留在内存中的函数)并且 PHP 无法重用已经位于内存中的函数让我认为存在错误而不仅仅是“性能差”的事情.这行特定的代码是 PHPDoc 中的示例,并在许多大型框架中重复使用,例如Zend 和 PEAR 等等。再多一行就可以解决这个“错误”,检查一下。但我不是在寻找解决方案:我在寻找真相。这是一个错误还是只是我的方法。后者我还不能决定。
最佳答案
在 create_function()
的情况下,使用 eval()
创建 lambda 样式的函数,并返回包含其名称的字符串。然后将该名称作为参数传递给 array_map()
函数。
这不同于闭包风格的匿名函数,后者根本不使用包含名称的字符串。 函数($o) { 返回$o->id;
是函数,或者更确切地说是 Closure 类的一个实例。
eval()
函数在 create_function()
中,执行一段 PHP 代码来创建所需的函数。有点像这样:
function create_function($arguments,$code)
{
$name = <_lambda_>; // just a unique string
eval('function '.$name.'($arguments){$code}');
return $name;
}
请注意,这是一种简化。
因此,一旦函数被创建,它将一直持续到脚本结束,就像脚本中的普通函数一样。在上面的 BAD 示例中,在循环的每次迭代中都会像这样创建一个新函数,占用越来越多的内存。
但是,您可以故意破坏 lambda 风格的函数。这很简单,只需将循环更改为:
while (true)
{
$func = create_function('$o', 'return $o->id;');
$objects = array_map($func, $objects);
echo memory_get_usage() ."\n";
sleep(1);
}
包含对函数的引用(= 名称)的字符串在这里是明确的和可访问的。现在,每次调用 create_function()
时,旧函数都会被新函数覆盖。
所以,不,没有“内存泄漏”,它本来就是这样工作的。
当然下面的代码效率更高:
$func = create_function('$o', 'return $o->id;');
while (true)
{
$objects = array_map($func, $objects);
echo memory_get_usage() ."\n";
sleep(1);
}
并且只应在您的 PHP 版本不支持闭包式匿名函数时使用。
关于php - 内存泄漏?!在 'create_function' 中使用 'array_map' 时,垃圾收集器是否正常运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25808390/
引用网址 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 。效果很好。但不适合重复收集。 我的网络服务返回此:
我是一名优秀的程序员,十分优秀!