mongodbから.csvにいくつかのドキュメントをエクスポートしようとしています。いくつかの大規模なリストについては、ファイルは40Mのようなものになるだろう、私は、メモリの制限に関するエラーを取得:メモリサイズが使い果たされました。mongodbからのエクスポートエラー
Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 44992513 bytes) in
/usr/share/php/Zend/Controller/Response/Abstract.php on line 586
このエラーはなぜ起こるか、私は疑問に思います。そのような量のメモリを消費するのは何ですか? memory_limit
が変更されずにこのようなエラーが発生するのを避けるにはどうすればいいですか?128M
になりました。
:
public static function exportList($listId, $state = self::SUBSCRIBED)
{
$list = new Model_List();
$fieldsInfo = $list->getDescriptionsOfFields($listId);
$headers = array();
$params['list_id'] = $listId;
$mongodbCursor = self::getCursor($params, $fieldsInfo, $headers);
$mongodbCursor->timeout(0);
$fp = fopen('php://output', 'w');
foreach ($mongodbCursor as $subscriber) {
foreach ($fieldsInfo as $fieldInfo) {
$field = ($fieldInfo['constant']) ? $fieldInfo['field_tag'] : $fieldInfo['field_id'];
if (!isset($subscriber->$field)) {
$row[$field] = '';
} elseif (Model_CustomField::isMultivaluedType($fieldInfo['type'])) {
$row[$field] = array();
foreach ($subscriber->$field as $value) {
$row[$field][] = $value;
}
$row[$field] = implode(self::MULTIVALUED_DELEMITOR, $row[$field]);
} else {
$row[$field] = $subscriber->$field;
}
}
fputcsv($fp, $row);
}
}
その後、私のコントローラで、私はこのような何か、それを呼び出そう:だから私は、私はエクスポートファイルの末尾によ
public function exportAction()
{
set_time_limit(300);
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$fileName = $list->list_name . '.csv';
$this->getResponse()->setHeader('Content-Type', 'text/csv; charset=utf-8')
->setHeader('Content-Disposition', 'attachment; filename="'. $fileName . '"');
Model_Subscriber1::exportList($listId);
echo 'Peak memory usage: ', memory_get_peak_usage()/1024, ' Memory usage: ', memory_get_usage()/1024;
}
データ。それは私が1Mドキュメントのようなものをエクスポートするリストについては、それが成功して表示輸出していることではなく奇妙です:
> Peak memory usage: 50034.921875 Kb Memory usage: 45902.546875 Kb
しかし、私は1.3M文書をエクスポートしようとすると、その後、数分後に私は、エクスポートファイルで入手:
Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 44992513 bytes) in
/usr/share/php/Zend/Controller/Response/Abstract.php on line 586.
エクスポートするドキュメントのサイズはほぼ同じです。私は256Mまでのmemory_limitを増加させ、1.3Mのリストをエクスポートしようとした
、これはそれが示したものです:
Peak memory usage: 60330.4609375Kb Memory usage: 56894.421875 Kb.
それは私にとって非常に混乱しそうです。このデータは不正確ではありませんか?それ以外の場合、memory_limitが128Mに設定されているとメモリが枯渇した原因となるのはなぜですか?
メモリを解放する方法もありません。このケースでは、輸出用に他の言語を使用するのはむしろ問題になると思います。メモリ制限を256Mまで試してみるつもりですが、この制限は私にとっては非常に大きいようです。 – Oleg
私は256Mにmemory_limitを増やし、1.3Mのリストをエクスポートしようとしましたが、これはそれが示したものです:ピークメモリ使用量:60330.4609375Kbメモリ使用量:56894.421875 Kb。それは私にとって非常に混乱しているようです。 – Oleg
あなたはこれを説明してください: "あなたができることの1つは、処理を外部スクリプトにオフロードし、PHPから呼び出すことです。"私は今この操作をオンラインで実行します。私はPHPから呼び出される他の言語スクリプトをどのように実行するのかよく分かりません。それはどんな言語ですか? – Oleg