我正在将数据从一个数据库传输到另一个数据库。它们是不同的数据库(从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>";
}


设置限制并不重要,每次处理部分花费的时间是原来的两倍。我正在记录循环的每个部分,并从旧数据库中选择数据并将其插入到新数据库中完全没有时间。每次“处理部分”都加倍。为什么?这是日志,如果您在时间戳上进行了一些快速数学运算,则标记为“处理应用程序”的每个步骤所花费的时间是以前的两倍...(我在此步骤上稍早停止了,但是花费了很多时间。在最终迭代中需要更长的时间)

最佳答案

好吧-我不知道为什么会这样,但是如果我将while循环中的所有内容移到一个单独的函数中,它将戏剧性地提高性能。我猜测这是垃圾收集/内存管理的问题,而函数调用结束有助于垃圾收集器知道它可以释放内存。现在,当我记录内存使用率时,两次调用之间的内存使用率保持不变,而不是增长...脏PHP ...

09-25 16:59
查看更多