加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 17:05:24 所属栏目:PHP教程 来源:网络整理
导读:我有一个 PHP脚本导入CSV文件并经历数万次迭代.由于脚本运行了几个小时,内存使用量不断上升,如果文件足够大,脚本会占用大量内存,整个机器都会停止运行. 现在,我正在使用的唯一技术是在我完成它之后取消设置().我试图隔离使用最多内存的部分,但似乎我的脚本中
我有一个 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数据的极端情况.实际上,这可以通过临时文件或实际数据库(可能是临时表)更好地服务,因此它可能不是一个好主意……

祝好运…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读