0

を使用してメモリ制限エラーが発生しfetchAllたため、代わりに使用しようとしてfetchいますが、それを行う方法が見つかりません。なにか提案を?whileの代わりにをどこで/どのように使用するforeach

元のコードは次のとおりです。

// We get all the data from the table
$Qselect = $pdo->prepare('SELECT * FROM '.$table_to_export.''); 
$Qselect->execute(array(''));
$results = $Qselect->fetchAll(PDO::FETCH_ASSOC); // Here is the problem
$countRmain = $Qselect->rowCount();

// We get the column names
$Qdescribe = $pdo->prepare('DESCRIBE '.$table_to_export.'');
$Qdescribe->execute();
$limit = $Qdescribe->rowCount()-1;      // Number of column in the table
$table_fields = $Qdescribe->fetchAll(PDO::FETCH_COLUMN); // No problem here

foreach($table_fields as $key => $fields){
    $outputCsv .= trim($fields).';';
}

// We remove the ; at the end
$outputCsv = rtrim($outputCsv, ';');

// Data
$outputCsv .= "\n";
if($countRmain > 0){
    foreach($results as $row){
            $column = 0 ;
        foreach ($row as $key => $val){         
            if (is_null($val)){
                $outputCsv .= 'NULL;';  // If the field id empty, we add NULL
            }
            else {
                $outputCsv .= $val.';'; // We add the value in the file
            }
            if ($column == $limit)
                $outputCsv .= "\n";
            $column ++;
        }
    }
}
    else
        exit('No data to export');

foreachループを含めようとしましwhile($results = $Qselect->fetch()){たが、非常に長い時間がかかります (50000 行で 10 分)

PS: PHP の memory_limit を増やすと、fetchAll で動作しますが、この解決策は必要ありません。

4

2 に答える 2

0

これを試してみてください。

1. comment line 4
2. Replace line 23:
    while($row = $Qselect->fetch(PDO::FETCH_ASSOC)){
3. Skip (or Replace) checks on line 22

アイデアは単純です: u は$result先に取得しましたが、配列全体をロードしていません。レコードを段階的にロードするだけです。コード反復ループの一部を別の同じコード反復に置き換えるため、1M行でも十分に遅くなるわけではありません。
それでも時間の問題がある場合は、コードを再編成して最適化してみてください。

于 2012-09-09T14:35:12.607 に答える
-2

私もこの問題に遭遇しました。

ページの実行が停止しないように、次の変数を増やします。

max_input_time
memory_limit
max_execution_time

またはあなたが使用することができます

while($row = $Qselect->fetch(PDO::FETCH_ASSOC)){

fatchAll の代わりに

于 2012-09-09T13:37:31.027 に答える