2015-12-02 48 views
2

我沒有記錄只是15000.而內存php配置爲使用128 MB。所以我得到這個錯誤。的134217728個字節Yii findAll()導致內存問題

允許的內存容量耗盡

有2種方式來處理這個問題。

  1. DAO http://www.yiiframework.com/doc/guide/1.1/en/database.dao
  2. 增加內存允許PHP

我很困惑的是,如果我增加允許到256內存,有一天,當數據的數量爲30 000本錯誤將再次出現。

所以我應該不使用Yii cactiverecord findAll()當我開發大型應用程序時?或者隨着更多數據的進入,我應該不斷增加內存大小。

什麼是最佳方法?

+1

使用'createCommand'與自定義查詢即;只抓取你需要的東西並使用索引。 – Criesto

+1

這不是一個真正的解決大型模型陣列的問題,但你可以做的是用戶 - > select()只選擇你需要的數據,所以如果你想顯示一個名字,你不需要id,電子郵件excetra。比你可以做的是客戶:: find() - >選擇('名稱') - >所有() – Rickert

+0

可能重複的[優化foreach數千項目](http://stackoverflow.com/questions/24284551/optimization對於成千上萬的項目) – topher

回答

6

嘗試使用批處理retrive數據:

http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#data-in-batches

// fetch 10 customers at a time 
foreach (Customer::find()->batch(10) as $customers) { 
    // $customers is an array of 10 or fewer Customer objects 
} 

// fetch 10 customers at a time and iterate them one by one 
foreach (Customer::find()->each(10) as $customer) { 
    // $customer is a Customer object 
} 

// batch query with eager loading 
foreach (Customer::find()->with('orders')->each() as $customer) { 
    // $customer is a Customer object with the 'orders' relation populated 
} 
+0

是一種很好的做法嗎?總是獲得批量數據。 – dev1234

+0

哈。我已經使用了一個移植版本的CDataProviderIterator來做到這一點。傻我。 – undsoft

+0

@ dev1234它取決於。每批都是一個新的SQL查詢,所以它應該花更長的時間。您可以調整批量以獲得最佳速度和內存使用情況。 – topher