我正在将数据从一个数据库传输到另一个数据库。它们是不同的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;花费的时间是之前的两倍......(我在这个时间稍早停了一下,但是在最后的迭代中花了相当长的时间)
答案 0 :(得分:0)
好吧 - 所以我不知道为什么会这样,但是如果我把while循环中的所有内容都移到一个单独的函数中,它就会大大提高性能。我猜它的垃圾收集/内存管理问题,并且具有函数调用结束有助于垃圾收集器知道它可以释放内存。现在,当我记录内存使用情况时,内存使用量在调用之间保持不变而不是增长... Dirty php ...