提高PHP导入脚本的内存使用率
我有一个
PHP脚本导入CSV文件并经历数万次迭代.由于脚本运行了几个小时,内存使用量不断上升,如果文件足够大,脚本会占用大量内存,整个机器都会停止运行.
现在,我正在使用的唯一技术是在我完成它之后取消设置().我试图隔离使用最多内存的部分,但似乎我的脚本中的每个函数都只是骆驼背上的一根稻草,并且使用“尽可能少的内存”. 那我该怎么办? 我已经尝试过研究基准/分析工具,但我没有发现任何好的东西.我在Windows机器上,通过SSH连接到Linux机器. 解决方法
好的,既然你正在寻找技术,那么让我列出一些……
1.不要读取文件,将它们流式传输 不要调用$data = file_get_contents($file),而是用fopen打开它,只读取那个时间点所需的数据(fgets或fgetcsv等).这将是一个较慢的触摸,但它将使用FAR较少的内存. 2.升级到5.3.4 如果你仍然使用PHP 5.2.x,升级到5.3.x(最新的5.3.4)将大大节省内存.它包括一个垃圾收集器,它会在一段时间后清理释放的内存. 3.不要在全球范围内使用任何东西 不要在全局范围内存储任何信息.它永远不会在执行结束前清理,所以它本身可能是内存泄漏. 4.不要传递参考文献 PHP使用copy-on-right.传递引用只会增加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数据的极端情况.实际上,这可以通过临时文件或实际数据库(可能是临时表)更好地服务,因此它可能不是一个好主意…… 祝好运… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |