php - 防止内存溢出的正确方法,知道允许的内存大小,但无法更改它

标签 php

在 stackoverflow 上搜索答案后,我决定只处理与最大允许内存扩展有关的问题。我的问题是,是否有人知道如何插入适当的制动器,以防脚本因内存耗尽而失败。

对于 A 点,这也与我未能找到答案的另一个问题非常密切相关,即 B 点,这就是时间限制:关于如何延长时间限制的另一组答案使用ini_set 等等,通过手动创建断点找到了可能的解决方案,以防脚本已经超过适当的时间。这很好,但是无法控制您正在加载的脚本可能无法阻止它。

现在回到问题,有没有人知道如何用安全的方法正确地防止此类错误发生?如果真的有关于此主题的已回答问题,请将我链接到它。

最好的问候,

最佳答案

减少程序可能使用的内存量的常用方法是将问题分解成更小的部分,迭代地优化答案,使用磁盘上的文件代替结构的内存等。在不知道应用程序细节的情况下,不可能真正提出最佳方法

但是请考虑在大约 100kb 的内存空间中对 100 兆字节的输入文件进行排序的任务;您可能认为如果不在内存中同时保存所有 100 兆字节,这项任务是不可能完成的。但是,您可以使用许多不同的方法轻松地将此问题拆分为更小的部分:

  • 或许对所有以整数开头的行进行排序 0-1000 into one file, 1001-2000 into another file, 2001-3000 into a third file, etc.一旦所有行都被分成不同的文件,对每个文件进行排序,然后通过简单的串联合并输入文件。

  • 也许一次对前 1000 行进行排序,将它们存储到一个临时文件中,接下来的 1000 行存储到另一个临时文件中,依此类推;然后 merge the output通过从每个文件中选择最低的输出,输出它,从它的文件中删除它,然后迭代。

考虑图像编辑任务:与其将整个图像加载到内存中,不如将要处理的部分读入内存,执行操作,然后立即将内容重新写回磁盘。

或者,如果您的问题是大型正则表达式匹配,您可能有一个重要的 backtracking一次存储太多状态的问题。您可以转换为 different matching operators以防止回溯并可能解决多个匹配的问题。

这取决于您要解决的问题,如何将其分解成更小的部分以减少整体内存使用。请注意,其中许多技术可以增加执行时间,因为它们需要更多的磁盘 IO 或解决本可以保存在内存中的问题。有时它们会加快执行时间,因为您使用或保留的数据越少越好 locality of reference ,并且缓存可以更好地工作。 (这种情况很少见。请参阅 Programming Pearls 以了解由于更简单的问题解决而加速的非常显着的案例...)

关于php - 防止内存溢出的正确方法,知道允许的内存大小,但无法更改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8584500/

相关文章:

javascript - 如何随机选择三张图像,然后用新图像将它们淡出?

javascript - 从 React 到 PHP 文件的 Ajax 调用

php - Mysql PDO 没有正确插入序列化的 php 数据(在 ´ 符号处截断)?

php - 了解 PHP 中的特征与组合

php - 在 MYSQL 中使用 SELECT MAX(id) 而不是在 PHP 中使用 mysql_insert_id() 有多糟糕?

php - 在 yii2 中使用 ajax 填充或填充所有字段

php - 这个函数是否容易受到 SQL 注入(inject)攻击?

PHP + mysql_num_rows

php - 我无法从我的代码中获得所需的结果

php - Godaddy Ubuntu 3.6 mod_rewrite 问题