[英]Zend Framework, pdo_mysql and problems with memory limit - Why?
我有以下設置:
我想從表中選擇所有內容,這應該沒問題:
$table = new Application_Model_DbTable_Foo();
$everything = $table->fetchAll();
這樣做我遇到了“內存耗盡”的問題。
我在沒有Zend Framework的情況下使用PDO_MYSQL編寫了一個腳本,內存使用情況很好,而且工作正常。
所以我必須在這里遺漏一些東西。 任何提示高度贊賞。 :-)
單獨22k行可以獲得大量數據,具體取決於腳本的運行情況。 如果無法增加內存限制,則可能需要嘗試此操作。 抓住行的“大塊”。 你可以用LIMIT
做到這一點。 將頁面大小設置為適合內存的內容,然后進行處理。 繼續增加OFFSET
直到處理OFFSET
所有數據為止。
各位大家,看看我的問題。 :-)
如需進一步參考,如果其他人有這個問題,我最終會這樣:
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$result = $db->query("SELECT * from footable");
foreach ($result as $row) {
//print $row["field"];
}
unset($result);
...仍在考慮切換到“使用LIMIT x,y獲取它” - 建議。
當我在Zend Framework項目上時(直到ZF 1.0),我在Zend_Db組件上工作了很多。
正如@netcoder所說,Zend_Db_Table組件為每個提取的行創建對象。 對象比原始數組占用更多內存,但它們也為您提供了使用OO用法和save()
等的機會。
真正的麻煩是你在大型數據集上做fetchAll()
。 即使你的內存限制可以處理22000行,明天你將需要44000行,下個月需要100000行。
無論Zend_Db實現如何,或者如果您使用沒有框架的PDO,您都需要學習管理大型數據集而不將它們完全加載到內存中,因為這將不可避免地導致內存耗盡。 對於任何庫或框架甚至任何語言都是如此。
您可以嘗試使用LIMIT
因為@Chris Henry建議,所以您一定要獲取不太多的固定數量的行。
或者,您可以一次一行地獲取數據,因此內存中只有一行。 Zend_Db_Table類沒有提供執行此操作的方法; 您必須使用Zend_Db_Adapter接口自行運行SQL查詢,然后使用fetch()
循環結果。
請參閱http://framework.zend.com/manual/en/zend.db.statement.html上的示例
Zend_Db使用了很多抽象,類等。對於結果集中的每一行,它創建一個對象(Zend_Db_Table_Row)。 每行的對象使用比具有鍵值對的數組更多的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.