2010-11-05 27 views
3

我有以下設置:Zend Framework,pdo_mysql和內存限制問題 - 爲什麼?

  • Zend框架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寫了一個腳本,內存使用情況良好,並且它工作正常。

所以我必須在這裏失去一些東西。任何提示高度讚賞。 :-)

+0

Zend Framework DB抽象== NOT_SO_GOOD。在第2版中存在一些重寫的​​文獻。 – Andreas 2010-11-05 20:47:11

回答

2

根據您的腳本正在做什麼,僅22k行就可以獲得大量數據。如果增加內存限制不是一個選項,你可能想試試這個。抓住「塊」的行。你可以用LIMIT來做到這一點。將頁面大小設置爲適合內存的內容,然後處理該內容。繼續增加您的OFFSET,直到您處理完所有數據。

0

Zend_Db使用了很多抽象,類等。對於結果集中的每一行,它都會創建一個對象(Zend_Db_Table_Row)。每行的對象使用的方式多於具有鍵 - 值對的數組。

1

當我在Zend Framework項目上(直到ZF 1.0),我在Zend_Db組件上做了很多工作。

正如@netcoder所說的,Zend_Db_Table組件爲獲取的每一行創建對象。對象需要比原始數組更多的內存,但它們也讓您有機會使用OO用法和save()等。

真正的麻煩在於您在大型數據集上執行fetchAll()。即使你的內存限制可以處理22000行,明天你將需要44000行,並在下個月100000行。

無論Zend_Db的實現如何,或者如果您在沒有框架的情況下使用PDO,您需要學習如何管理大型數據集而不將其完全加載到內存中,因爲這將不可避免地導致內存耗盡。任何圖書館或框架甚至任何語言都是如此。

您可以嘗試使用@Chris Henry建議的LIMIT,因此您一定要獲取固定數量的不太多的行。

或者,您可以一次獲取一行數據,因此您只有一行內存。 Zend_Db_Table類沒有提供這樣的手段;您必須使用Zend_Db_Adapter接口自己運行SQL查詢,然後使用fetch()循環結果。

見的例子在http://framework.zend.com/manual/en/zend.db.statement.html

2

感謝名單,每個人,對於具有看看我的問題。 :-)

有關進一步的參考,如果別人有這個問題,我弄成這個樣子:

$db = Zend_Db_Table_Abstract::getDefaultAdapter(); 
    $result = $db->query("SELECT * from footable"); 
    foreach ($result as $row) {    
      //print $row["field"]; 
    } 
    unset($result); 

...還在考慮使用極限,X,Y,切換到「得到它的塊「-建議。