2013-01-23 53 views
3

我有一個將MySQL數據庫導出爲CSV格式的PHP腳本。奇怪的CSV格式是第三方軟件應用程序的要求。它最初起作用,但是現在我在743行的內存不足了。我的託管服務有66MB的限制。CSV導出腳本內存不足

我的完整代碼在這裏列出。 http://pastebin.com/fi049z4n

是否有替代品可以使用array_splice?任何人都可以幫助我減少內存使用量。什麼功能可以改變?我如何釋放內存?

+1

你好,請在這裏展示的代碼的相關部分。張貼Pastebin鏈接*單獨*是皺眉(雖然它們有時作爲補充有用)。謝謝! –

+2

讀取和寫入塊。對於cli解釋器來說'66M'也非常低。通常沒有理由限制氣候解釋者。與您的主機交談。 – KingCrunch

+0

你想在內存中構建整個東西嗎?請向我們展示一些代碼或僞代碼。 –

回答

7

你必須改變你的CSV創建策略。相反,如果從數據庫中讀取整個結果到內存中的數組必須sequencially工作:

  • 從數據庫
  • 讀取一行寫該行到CSV文件(或也許緩衝)
  • 免費從內存行
  • 在一個循環中執行此操作...

這樣你的腳本的內存消耗不升道具與結果中的行數成比例,但保持(或多或少)恆定。

這或許可以作爲一個未經測試的例子素描的想法:

while (FALSE!==($row=mysql_fetch_result($res))) { 
    fwrite ($csv_file."\n", implode(',', $row)); 
} 
+0

感謝您的支持。你有鏈接到這個例子嗎?或者我可以在哪裏閱讀這項技術? – Rynardt

+0

我添加了建議方法的草圖。目前沒有鏈接。請注意,您將結果成員中包含的任何分隔符轉義(',')。 – arkascha

1

增加內存限制和最大執行時間

例如:

// Change the values to suit you 
ini_set("memory_limit","15000M"); 
ini_set("max-execution_time", "5000"); 
+0

@Ben Carey感謝您修復錯字。 – uvinod

+0

是的,將內存限制增加到512MB可以修復它,但這只是一個臨時解決方案,因爲數據仍然會增加100倍。 – Rynardt

+0

你把這個放在哪裏? – SeanKendle