2012-11-22 61 views
1

我試圖從MySQL表中獲取數以百萬計的行到PHP我的應用程序。內存不足和允許內存大小*字節耗盡之間的差異

獲取數據的步驟如下所示。

  1. 發送查詢到MySQL用的mysql_query()或mysqli_query()..

  2. 集結果通過使用mysql_fetch_array(循環每行陣列)。或者通過使用mysqli_fetch_all添加陣列()。

我把消息'內存不足'或'允許內存大小*字節耗盡'。

如果我更改'memory_limit',我可能可以解決它們。

但我想知道爲什麼顯示這些消息。

我已經更改'memory_limit',如128M-> 512M - > 1024M。

當我設置128M,發送查詢失敗,允許內存大小*字節用盡,我不能將結果添加到數組區域。

然後設置512M,查詢成功完成,但我無法將結果添加到允許內存大小爲*字節的內存耗盡。

最後設置爲1024M,發送查詢和設置結果都將結果添加到數組已完成。但有時mysqli_fetch_all()是內存不足的字段。

我不明白的一件事是爲什麼內存不會不斷髮生?

我還想知道的另一件事是如何從一張表中獲取整個行超過一百萬到更少的內存轉向。獲得整行後,我希望讓我的用戶通過瀏覽器操作訪問它們,包括下載一些類似csv的文件。

+0

當您更改內存限制時 - 是否重新啓動Apache? – Chris

+0

是的,我做過了。我再次訪問Apache。 – user1345414

回答

4

當需要的內存量超過php.ini文件中指定的內存限制時,您將得到「允許的內存大小*字節耗盡」。

當服務器本身(或Apache或MySQL)內存不足時,您將得到「內存不足」。

+0

這些都是當我坐着512M內存的消息的例子。 內存不足(分配519307264)(試圖分配132702048字節)。 允許內存大小爲536870912字節耗盡(試圖分配2403012字節)。 所以我可以解釋他們不能嗎? 我試過132702048,但我不能,除非我保留由mySQL或某人造成的519307264。 我試過2403012,但我已經使用536870912. – user1345414

+0

服務器的可用內存總量是多少? – Sudar

+0

我的服務器有4GB物理內存。 – user1345414

1

檢索大量行的最佳選擇是在查詢中使用limitoffset並循環遍歷它們。

這將防止您面臨的內存問題。

+0

同意。如果您需要創建CSV的所有數據,請考慮將一些行寫入CSV,然後獲取新數據.PHP應該執行垃圾回收,但您可能想要在循環中挑剔並關閉結果集/未設置變量。 –

+0

謝謝你的建議。我會這麼做的,但是我的問題是兩個內存問題之間的區別。我指的是顯示消息的情況的差異。 – user1345414

相關問題