PHP数组插入/操作降级迭代

时间:2014-10-30 08:30:41

标签: php mysql sql-server performance

我正在将数据从一个数据库传输到另一个数据库。它们是不同的dbs(mssql到mysql)所以我不能直接查询并使用PHP作为中介。请考虑以下代码。出于某种原因,每次通过while循环时,它需要的时间是之前的两倍。

$continue = true;
$limit = 20000;

while($continue){
    $i = 0;
    $imp->endTimer();
    $imp->startTimer("Fetching Apps");

    $qry = "THIS IS A BASIC SELECT QUERY";
    $data = $imp->src->dbQuery($qry, array(), PDO::FETCH_ASSOC);

    $inserts = array();
    $continue = (count($data) == $limit);

    $imp->endTimer();
    $imp->startTimer("Processing Apps " . memory_get_usage() );

    if($data == false){
        $continue = false;
    }
    else{
        foreach($data AS $row){

            // THERE IS SOME EXTREMELY BASIC IF STATEMENTS HERE

            $inserts[] = array(
                "paymentID"=>$paymentID,
                "ticketID"=>$ticketID,
                "applicationLink"=>$row{'ApplicationID'},
                "paymentLink"=>(int)($paymentLink),
                "ticketLink"=>(int)($ticketLink),
                "dateApplied"=>$row{'AddDate'},
                "appliedBy"=>$adderID,
                "appliedAmount"=>$amount,
                "officeID"=>$imp->officeID,
                "customerID"=>-1,
                "taxCollected"=>0
            );
            $i++;
            $minID = $row{'ApplicationID'};
        }
    }


    $imp->endTimer();
    $imp->startTimer("Inserting $i Apps");

    if(count($inserts) > 0){
         $imp->dest->dbBulkInsert("appliedPayments", $inserts);
    }

    unset($data);
    unset($inserts);
    echo "Inserted $i Apps<BR>";
}  

设置限制并不重要,处理部分每次需要两倍的时间。我正在记录循环的每个部分,并从旧数据库中选择数据并将其插入新数据库中。 &#34;处理部分&#34;每次都在翻倍。为什么?以下是日志,如果您对时间戳进行快速数学计算,则每个步骤都标记为&#34;处理应用程序&#34;花费的时间是之前的两倍......(我在这个时间稍早停了一下,但是在最后的迭代中花了相当长的时间)

logs

1 个答案:

答案 0 :(得分:0)

好吧 - 所以我不知道为什么会这样,但是如果我把while循环中的所有内容都移到一个单独的函数中,它就会大大提高性能。我猜它的垃圾收集/内存管理问题,并且具有函数调用结束有助于垃圾收集器知道它可以释放内存。现在,当我记录内存使用情况时,内存使用量在调用之间保持不变而不是增长... Dirty php ...