【发布时间】:2010-11-03 20:50:58
【问题描述】:
我的 PHP 应用程序有一个可以导入记录的导入脚本。
目前,它正在从 CSV 文件导入。它正在读取 CSV 文件的每一行,使用 fgetcsv 一次一行,并且对于每一行,它对该记录进行大量处理,包括数据库查询,然后继续下一行。它应该不需要继续积累更多的内存。
在导入大约 2500 条记录后,PHP 死了,说它已超出其内存限制(132 MB 左右)。
CSV 文件本身只有几兆 - 发生的其他处理会进行大量字符串比较、差异等。我有大量代码在上面运行,很难想出一个'最小的复制样本'。
有哪些好方法可以找到并解决此类问题?
找到问题的原因
我有一个调试类,它在运行时记录我的所有数据库查询。因此,那些大约 30KB 长的 SQL 字符串保留在内存中。我意识到这不适合设计为长时间运行的脚本。
可能还有其他内存泄漏源,但我相当确定这是我的问题的原因。
【问题讨论】:
-
+1 我在 PHP 中经常使用 CSV 文件,但最终会遇到这个问题。
-
我在 CodeIgniter 处理大日志文件并插入数据库时遇到了类似的问题。我将插入更改为使用 CodeIgniters
simple_query而不是通常的query方法,并将内存使用量减少了 10 倍。
标签: php memory-leaks reference-counting