用不同长度的变量计算剩余时间

时间:2012-10-24 17:20:23

标签: time

我将不得不承认这个问题的标题很糟糕......我无法得到最好的描述。让我看看我是否可以举一个例子。

我的服务器上一次安装了大约2700名客户。 1500左右还在做。基本上我所做的是自动诊断,以帮助清除已卸载或有软件问题的人员,以便我们协助。目前我们有一个cURL为我们的软件提取他们的网站并寻找标题返回。

我们返回了8种不同的状态

绿色 - 一切正常(通常很快0.5 - 2秒) RED - 找不到软件(通常最长5到15秒)
蓝色 - 找到但未激活的软件(通常为3 - 9秒)
黄色 - 服务器IP不匹配(通常为1 - 3秒)
ORANGE - 服务器IP不匹配和错误的软件类型(通常为5 - 10秒)
PURPLE - 激活密钥不正确(通常在2秒内)
黑色 - 域名返回404 - 不再存在(通常在一秒钟内)
UNK - 连接失败(通常由于我们的负载均衡器 - 非常罕见)(从未反驳过这种情况)

现在基本上发生的事情是cronJob将通过拉动域和产品类型来启动流程。然后它会转换域并开始循环上面的状态颜色。

在发生这种情况时,我们有一个返回结果的ajax页面,以便我们可以关注状态。主要问题是时间剩余是如此不稳定,以至于没有做出好的估计。这是当前的数学:

# Number of accounts between NOW and when started
$completedAccounts = floor($parseData[2]*($parseData[1]/100));

# Number of seconds between NOW and when started
$completedTime = strtotime("now") - strtotime("$hour:$minute:$second"); 

# Avg number of seconds per account
$avgPerCompleted = $completedTime / $completedAccounts; 

# Total number of remaining accounts to be scanned
$remainingAccounts = $parseData[2] - $completedAccounts;

# The total of seconds remaining for all of the remaining accounts
$remainingSeconds = $remainingAccounts * $avgPerCompleted;

$remainingTime = format_time($remainingSeconds, ":");

我可以在所有的绿色,红色,蓝色等上创建一个计数...并且平均每种颜色做多长时间,然后在平均时间内使用它,尽管我不相信会给出更好的结果。

由于时间差异如此多变,任何建议都会感激不尽?

谢谢, 杰夫

1 个答案:

答案 0 :(得分:1)

好的,我相信我已经弄明白了。我不得不创建一个类,所以我可以计算一段时间内的单个回归。

    function calc() {
        $n = count($this->mDatas);
        $vSumXX = $vSumXY = $vSumX = $vSumY = 0;

        //var_dump($this->mDatas);
        $vCnt = 0; // for time-series, start at t=0<br />
        foreach ($this->mDatas AS $vOne) {
            if (is_array($vOne)) { // x,y pair<br />
                list($x,$y) = $vOne;
            } else { // time-series<br />
                $x = $vCnt; $y = $vOne;
            } // fi</p>
            $vSumXY += $x*$y;
            $vSumXX += $x*$x;
            $vSumX += $x;
            $vSumY += $y;
            $vCnt++;
        } // rof
        $vTop = ($n*$vSumXY – $vSumX*$vSumY);
        $vBottom = ($n*$vSumXX – $vSumX*$vSumX);
        $a = $vBottom!=0?$vTop/$vBottom:0;
        $b = ($vSumY – $a*$vSumX)/$n;

        //var_dump($a,$b);
        return array($a,$b);
    }

我获取每个帐户并开始构建一个数组,每个帐户花费的时间。然后,数组将运行此计算,以便构建x和y时间集。最后,我通过预测函数运行数组。

    /** given x, return the prediction y */
    function calcpredict($x) {
        list($a,$b) = $this->calc();
        $y = $a*$x+$b;
        return $y;
    }

我将静态值放入,以便您可以看到结果:

$eachTime = array(7,1,.5,12,11,6,3,.24,.12,.28,2,1,14,8,4,1,.15,1,12,3,8,4,5,8,.3,.2,.4,.6,4,5);
$forecastProcess = new Linear($eachTime);
$forecastTime = $forecastProcess->calcpredict(5);

这个整体系统给了我10个账户的.003差异,2700个账户差异约为2.6。接下来将计算准确度。

感谢您尝试男士和女士