提高PHP导入脚本的内存使用率

时间:2010-12-16 20:30:02

标签: php memory memory-management

我有一个导入CSV文件的PHP脚本,经历了数万次迭代。由于脚本运行了几个小时,内存使用量不断增加,如果文件足够大,脚本会占用大量内存,整个机器都会停止运行。

现在,我正在使用的唯一技术是unset()当我完成它时我能做的一切。我试图隔离使用最多内存的部分,但似乎我的脚本中的每个函数都只是骆驼背上的一根稻草,并且使用“尽可能少的内存。”

那我该怎么办?

我已经尝试过研究基准/分析工具,但我没有发现任何好的东西。我在Windows机器上,通过SSH连接到Linux机箱。

2 个答案:

答案 0 :(得分:4)

好的,既然你正在寻找技巧,那就让我列出一些......

<强> 1。不要读取文件,流式传输

不是调用$data = file_get_contents($file),而是使用fopen打开它,只读取您在该时间点所需的数据(fgetsfgetcsv等)。这将是一个较慢的触摸,但它将使用FAR较少的内存。

<强> 2。升级到5.3.4

如果你仍然使用PHP 5.2.x,升级到5.3.x(最新的5.3.4)将大大节省内存。它包括一个垃圾收集器,它会在一段时间后清理释放的内存。

第3。不要在全球范围内使用任何东西

不要在全球范围内存储任何信息。它永远不会在执行结束前清理,所以它本身可能是内存泄漏。

<强> 4。不要传递参考文献

PHP使用copy-on-right。传递引用只会增加unset无法获取所有引用的机会(因为您忘记了unset其中一个引用)。相反,只需传递实际变量。

<强> 5。描述代码

描述您的代码。将调试挂钩添加到每个函数调用的开始和结束,然后记录它们,观察每个函数的入口和出口处的内存使用情况。取这些差异,你就会知道每个函数使用了多少内存。采取最大的罪犯(那些被称为很多,或使用大量记忆)并清理它们......(最低挂果)。

<强> 6。使用其他语言

虽然你可以用PHP(我经常做)这样做,但要意识到它可能不是最好的工具。其他语言是针对这个问题设计的,所以为什么不使用其中一种语言(例如Python或Perl)......

<强> 7。使用Scratch Files

如果您需要跟踪大量数据,请不要将其全部存储在内存中。在未明确使用数据时,创建临时文件(临时文件)以存储数据。仅在您要使用该特定数据时加载文件,然后重新保存并删除变量。

<强> 8。仅限极端情况:不要使用大型阵列!

如果需要跟踪大量整数(或其他简单数据类型),请不要将它们存储在数组中! zval(内部数据结构)有一些开销。相反,如果您真的需要存储大量的整数(数十万或数百万),请使用字符串。对于1字节的int,ord($numbers[$n])将获得$n索引的值,$numbers[$n] = chr($value);将设置它。对于多字节整数,您需要执行$n * $b来获取序列的开头,其中$b是字节数。我强调这应该仅用于需要存储TON数据的极端情况。实际上,这可以通过临时文件或实际数据库(可能是临时表)更好地服务,因此它可能不是一个好主意......

祝你好运......

答案 1 :(得分:0)

你可以多次运行脚本,每次只处理少量文件吗?如果您正在累积总计或某些东西,您可以将它们存储在文件或memcached中,这样您仍然可以保持总计。