1

私はこの問題に数回遭遇しました。

データを CSV にエクスポートするコードがあります。私が使用している方法は、結果セットをテンプレートに渡します。テンプレートは結果を循環し、フィールドをエコーし​​ます。

アクションで:

$this->result = ObjectPeer::doSelect($criteria);

テンプレートでは:

foreach ($result as $row)
{
  echo $row->getValue1().','.$row->getValue2().','.$row->getValue3()...
}

ただし、結果セットが大きい場合は、メモリが不足します。

 [error] PHP Fatal error:  Allowed memory size of 268435456 bytes exhausted (tried to allocate 1556481 bytes) in exportSuccess.php on line 13, referer: https://mysite.com/module

プロセスは 250 MB 以上を使用していますが、作成されるファイルはわずか 2 MB です。php.ini がプロセスに与えるメモリの量を増やすことはできますが、むしろしたくありません。エクスポートが十分に大きい場合、十分なメモリを確保できるとは思えません。

これに似た他のいくつかのケースを読みましたが、各エコーの後に $row の設定を解除することを提案しました。私の場合はうまくいきませんでした。

このクエリをチャンクしてファイル全体を構築する方法があると思います-誰かが明確なチュートリアルを推奨または指摘できますか?

4

2 に答える 2

1

getValue1取得する要素の数 (つまり、 、 など) に応じて、別の方法でgetValue2結果を水和できます。

$stmt = ObjectPeer::doSelectStmt($m_criteria);
while ($row = $stmt->fetch(PDO::FETCH_NUM))
{
  echo $row[0];
}

また、次を使用して別のソリューションを確認できますdoSelectRS

$rs = ObjectPeer::doSelectRS($criteria);
$rs->setFetchMode(ResultSet::FETCHMODE_ASSOC);

while($rs->next())
{
  $records = $rs->getRow();
  // then use $records['key'] to retrieve information
}

他に確認できることはほとんどありません。Propel からのメモリ リークに関するこのフランス語記事。

于 2012-06-08T20:27:48.007 に答える
-1

csvファイルに書き込むための基本的な考え方は次のとおりです。これはデータベースへの接続を示していませんが、それ以降はすべてであり、最後に必ず接続を閉じてください。

$filename = 'c:\whatever.csv';

$fp = fopen($filename, "w")  or die(mysql_error());
echo "Connected to ".$filename." <br>";


$res = mysql_query("SELECT *
FROM $table1 

WHERE Something
");

// fetch a row and write the column names out to the file
echo mysql_error();
$row = mysql_fetch_assoc($res);
$line = "";
$comma = "";
foreach($row as $name => $value) {
$line .= $comma . '"' . str_replace('"', '""', $name) . '"';
$comma = ",";
}
$line .= "\n";
fputs($fp, $line);

// remove the result pointer back to the start
mysql_data_seek($res, 0);

// and loop through the actual data
echo mysql_error();
while($row = mysql_fetch_assoc($res)) {

$line = "";
$comma = "";
foreach($row as $value) {
    $line .= $comma . '"' . str_replace('"', '""', $value) . '"';
    $comma = ",";

}
$line .= "\n";
fputs($fp, $line);
}
于 2012-06-08T18:41:58.397 に答える