【问题标题】:Free memory in php for processing large arrays用于处理大型数组的 php 中的可用内存
【发布时间】:2013-08-30 00:32:10
【问题描述】:

以下内容应在 MySQL 表中的大型数组上运行:

$v1_views = $database->get_all("SELECT image_id FROM image_views");
$v2_array = array();
foreach ($v1_views as $view)
   $v2_array[$view["image_id"]]++;

($view 也是一个包含表中 2 个变量的数组)

我尝试过类似的方法,但它给了我一个内存已满的错误。 所以我在想,将它添加到这个 foreach() 的末尾会是一个好主意吗?:

unset($view["image_id"]);

所以它不会创建另一个大数组... 或者也许只是在 foreach() 之后:

unset($view);

在此之后,我还必须在 MySQL 中插入所有这些变量,并在 10000+ 行上进行更新

哪一个会产生最安全的结果?还是有更好的东西? 我怎样才能安全地完成所有这些工作,确保它成功完成而不会超载?

【问题讨论】:

    标签: php arrays memory memory-management


    【解决方案1】:

    $v1_views$v2_array 正在使用大量空间。但是$view 是一个只有一个元素的小数组,它不会占用太多空间。每次循环,变量被替换为下一行结果的值,并自动回收上一行的值。

    节省内存的方法是将所有查询结果组成一个数组。大多数数据库 API 都有一次获取一行的方法,所以代码的结构应该是这样的:

    $result = $database->query("SELECT image_id FROM image_views");
    $v2_array = array();
    while ($view = $result->fetch()) {
        $v2_array[$view["image_id"]]++;
    }
    

    我只是编造了方法名称queryfetch——如果您使用的是第三方 API,请查看文档以了解这些方法的具体名称。如果是本地类,如果这些方法不存在,您可能需要添加它们。

    【讨论】:

    • 它是一个开源图像板的扩展。谢谢,我去看看这个软件能不能做类似的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多