内存不足,Mysql_query()无法保存结果集

时间:2011-04-07 08:08:55

标签: php mysql memory

我尝试加载大约30.000条记录到mysql select。比我得到这个警告。 而且我试图将它们分解成更小的限制。每1000个。但为什么我仍然得到这个警告?

这是我的代码:

function processDataDb()
{
    $rowIncrement = 1000;

    $query = "SELECT count( * ) as totalfield FROM `isc_xml_data` ";
    $result = mysql_query($query) or die ("$query" . mysql_error());

    if ($result) 
    {
        $row = mysql_fetch_assoc($result);
        $total_row = $row['totalfield'];

        for($i = 0; $i < $total_row ; $i+=$rowIncrement)
        {
            $sql_c = "SELECT * FROM isc_xml_data order by id LIMIT " . $i . " , " . ($i + $rowIncrement - 1);
            $res_c = mysql_query($sql_c) or die (mysql_error());

            while($row = mysql_fetch_object($res_c)) 
            {
                echo $row->id."\n";
                $this->insertAndUpdateProduct($row->xmldata);       
            }

            unset($res_c);
        }

    } else {
        echo "result is unavailable";
    }
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

$sql_c = "SELECT * FROM isc_xml_data order by id LIMIT " .
    $i . " , " . ($i + $rowIncrement - 1);

http://dev.mysql.com/doc/refman/5.0/en/select.html#id714605

LIMIT的第二个参数是你想要多少,而不是上限;试试$rowIncrement

答案 1 :(得分:0)

unset($res_c);这是无效的,有mysql_free_result($res_c)功能。 此外,您可以在没有count(*)的第一次查询的情况下执行此操作 - 只需进行循环查询,直到至少返回一行。

答案 2 :(得分:0)

由于这一行:

$this->insertAndUpdateProduct($row->xmldata);    

你的 XML处理在内存方面非常低效,
而mysql只消耗一行内容。