2013-01-23 37 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