2012-03-04 107 views
0

我試圖用CakePHP 2.1的方法saveMany()保存超過10000條記錄的列表。但它給了我一個500錯誤,或者一個「內存耗盡」的致命錯誤。使用CakePHP的saveMany保存> 10000條記錄()

如果我在處理完整個數組後調試整個數組(所以,沒有調用save方法),時間小於0.05s。但是,當我添加保存方法($this->saveMany($save, array('validate' => false));)時,它會顯示我上面的錯誤之一。

我提到我在MySQL和PHP中使用InnoDB作爲我的存儲引擎作爲腳本語言。

我在做什麼錯,我該如何解決這個問題?

編輯

我回來這個問題,因爲我「解決」爲什麼那龐大的記錄數不保存。原因是......好,甚至沒有一條記錄被保存。我測試過只保存生成數組中的第一個元素,這就是它發生的情況:它會增加內存直到極限,然後死亡。我把它放在2GB內存的本地主機上,它仍然給我超過內存的錯誤。這很奇怪,我不明白爲什麼會發生這種情況。在另一個模型上應用的相同代碼按預期工作。我重新創建了模型和它的表格,但沒有成功。我能想到的唯一原因是表名的長度,但對我來說沒有意義。爲了保存單個記錄,什麼會產生這種內存增加?

+0

你需要多久做一次? 10000條記錄來自哪裏?您需要提供更多信息,以便人們可以建議其他方法。 – Henri 2012-03-04 14:39:27

+0

我正在爲我的應用程序構建一個緩存,以便每當我需要檢索並計算一些數據時,我只需從這些10000中獲取幾條記錄。我只需手動執行幾次。所以腳本的唯一要求是實際工作。 – linkyndy 2012-03-04 14:43:31

+0

更新了我的答案。你有沒有訪問MySQL控制檯? – Henri 2012-03-04 15:04:11

回答

2

保存10000行可能需要一段時間。確保你已經設置了php的時間限制set_time_limit(120);夠大。

您也可以嘗試通過一個像這樣一個保存記錄:

foreach($save as $s){ 

    $this->create(); 
    $this->save($s, array('validate' => false)); 

} 

編輯1:

但是如果原始數據從數據庫中來,你可以直接把它複製到緩存表MySQL的控制檯或使用$this->query();

或者你可以SELECTINTO OUTFILE和它的LOAD DATA INFILE到緩存表。

編輯2:

那麼只有一件事情在我腦海中是在時間將數據保存到文本文件,在磁盤和另一個函數讀取並保存它作爲許多行的時間/內存限制允許。您也可以嘗試將其保存在csv文件上並使用$this->query('LOAD DATA LOCAL INFILE xxx ...');

我想到,在保存之前應該禁用索引以使其更快。你可以通過使用$this->query('ALTER TABLE table DISABLE KEYS;');

+0

它仍然沒有達到目的。它再次發佈超過內存的錯誤。我無法更改內存/時間限制,因爲我在付費主機上。 – linkyndy 2012-03-04 14:27:18

+0

我沒有訪問控制檯,我真的不能複製它,因爲我需要對我的表中的數據執行一些操作。只有在數據修改爲緩存後才能保存。 – linkyndy 2012-03-04 15:19:17

+0

@linkyndy檢查出更新的答案... – Henri 2012-03-04 15:33:49