针对 80k 行的 PHP 数组优化

标签 php arrays

我需要帮助来找到超过内存限制的解决方法。我的限制是 128MB,从数据库我得到大约 80k 行,脚本在 66k 处停止。感谢您的帮助。

代码:

$posibilities = [];
    foreach ($result as $item) {
            $domainWord = str_replace("." . $item->tld, "", $item->address);

            for ($i = 0; $i + 2 < strlen($domainWord); $i++) {
                $tri = $domainWord[$i] . $domainWord[$i + 1] . $domainWord[$i + 2];


                if (array_key_exists($tri, $possibilities)) {
                    $possibilities[$tri] += 1;
                } else {
                    $possibilities[$tri] = 1;
                }
            }
        }

最佳答案

根据您的算法,您的瓶颈很可能不是数据库查询,而是您正在构建的 $possibilities 数组。

如果我正确地读取了您的代码,您将从数据库中获取域名列表。首先从每个域名中删除末尾的顶级域。

然后,您从结果字符串的左到右逐个字符地遍历,并从该字符串中收集字符的三元组,如下所示:

example.com => ['exa', 'xam', 'amp', 'mpl', 'ple']

您将这些三元组存储在数组的keys中,这是个好主意,并且您还对它们进行计数,这对内存消耗没有任何影响。然而,我的猜测是,可能的三元组的绝对数量,即 26 个字母和 10 个数字,是 36^3 = 46656 种可能性,每个可能性只为数组内的 key 占用 3 个字节,不知道如何它周围有许多样板代码,会占用您的内存限制很多。

可能有人会告诉你 PHP 如何通过数据库游标使用内存,我不知道,但你可以用一个技巧来分析你的内存消耗。

调用 memory-get-usage :

  • 每次迭代之前和之后,这样您就会知道每次光标前进浪费了多少内存,
  • 每次添加 $possibilities 之前和之后。

然后立即打印它们。因此,您将能够运行代码并实时查看内存的使用情况和严重程度。

此外,尝试在每次迭代后取消 $item。它实际上可能有帮助。

了解用于获取 $result 迭代器的特定数据库访问库将会有很大帮助。

关于针对 80k 行的 PHP 数组优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31116239/

相关文章:

php - 如何在dompdf中创建多个页面

php - 样式die()错误消息

Java 语法数组 {1,2,3} 与 new int[] {1,2,3}

java - 如何检查 boolean 数组的所有元素是否为真

php - 从数据库填充 HTML 表单

javascript - 按钮根本不起作用(Javascript)

php - 从存储在mysql中的路径显示图像

C# 通过 MemoryStream 追加 Pdf 页面

javascript - 转换数组的数组,并返回一个对象,数组中的每对元素作为键值对

javascript - 如何在 Javascript 中将数组值映射到对象内的数组?