簡體   English   中英

Zend Framework,pdo_mysql和內存限制問題 - 為什么?

[英]Zend Framework, pdo_mysql and problems with memory limit - Why?

我有以下設置:

  • Zend Framework 1.10.8
  • 數據庫適配器:pdo_mysql
  • 內存限制:128MB
  • 表類型:myisam
  • 表大小:4 MB
  • 記錄數:22.000
  • 列數:aprox。 70

我想從表中選擇所有內容,這應該沒問題:

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM