我需要帮助来找到超过内存限制的解决方法。我的限制是 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/