针对80k行的PHP数组优化

针对80k行的PHP数组优化,php,arrays,Php,Arrays,我需要帮助找到克服内存限制的方法。我的限制是128MB,从数据库中我得到大约80k行,脚本停止在66k。谢谢你的帮助 代码: $posibilities=[]; foreach($result作为$item){ $domainWord=str_replace(“.”“$item->tld,”,$item->address); 对于($i=0;$i+2

我需要帮助找到克服内存限制的方法。我的限制是128MB,从数据库中我得到大约80k行,脚本停止在66k。谢谢你的帮助

代码:

$posibilities=[];
foreach($result作为$item){
$domainWord=str_replace(“.”“$item->tld,”,$item->address);
对于($i=0;$i+2
鉴于您提供的代码片段很小(非常无用),我想为您提供一个MySQL答案,但我不确定您是否在使用MySQL

但是 -优化你的桌子

  • 使用
    EXPLAIN
    优化查询。重写查询,将尽可能多的逻辑放在查询中,而不是放在PHP代码中。 编辑:如果您使用的是MySQL,那么在
    选择
    关键字之前添加
    EXPLAIN
    ,结果将向您解释您给MySQL的查询是如何转化为结果的

  • 不要使用PHP
    strlen
    函数,因为这会降低内存效率-相反,您可以将字符串作为一组数组值进行比较,因此:

    for($i=0;!empty($domainWord[$i+2]);$i++){

  • 在你的MySQL中(如果你正在使用它),然后添加一个
    LIMIT
    子句,将查询分成3或4个块,比如说每个块25k行,这将适合你66k行的最大操作容量。Burki有这个好主意

在每个块的末尾,清除所有字符串并重新启动,设置为循环

$z = 0;
 while ($z < 4){
///do grab of data from database. Preserve only your output 
$z++;
}
$z=0;
而($z<4){
///从数据库抓取数据。只保留输出
$z++;
}

但可能比这些更重要的是在你的问题中提供足够的细节!! -你想得到什么样的数据? -您将数据存储在什么位置? -查找数据的标准是什么


这些答案将帮助比我更有知识的人向您展示如何正确优化您的数据库。

考虑到您的算法,您的瓶颈很可能不是数据库查询,而是您正在构建的
$posabilities
数组

如果我读对了你的代码,你会从数据库中得到一个域名列表。从每个域名中,你会首先去掉最顶层的域名

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

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

您将这些三元组存储在数组的
键中,这是一个好主意,您还可以对它们进行计数,这对内存消耗没有任何影响。然而,我的猜测是,可能的三元组的绝对数量,即26个字母和10个数字是36^3=46656个可能,每个可能仅为数组中的键占用3个字节,不知道有多少样板代码围绕它,采取相当多的从您的内存限制

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

把电话转到:

  • 在每次迭代之前和之后,您将知道每次游标前进浪费了多少内存
  • 每次添加到
    $probabilities
    之前和之后
然后马上打印出来,这样你就可以运行你的代码,实时地看到你的内存使用情况

另外,在每次迭代后,尝试取消设置
$item
。这实际上可能会有所帮助


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

纯数学告诉我们,在这些内存限制下,每条记录大约有1.6kb,减去内存中已有的数组数据结构和内容的一些开销。您试图存储什么样的数据,每个记录有多大rd?您也在执行一系列字符串操作,这将导致更多数据扰乱可用内存。我们无法告诉您如何根据给定的微小信息进行优化。如果您所描述的是正确的,可以将作业拆分为多个部分,例如通过限制数据库结果的数量。避免在此PHP中进行字符串操作。尝试在sql中进行所有操作以减少内存。如果操作安全,您可以
exec
shell\u exec
并使用操作系统字符串操作命令,如
sed
awk
$z = 0;
 while ($z < 4){
///do grab of data from database. Preserve only your output 
$z++;
}