正确的方法来防止内存溢出,知道允许的内存大小,但不能改变它


Proper way to prevent memory overflow, knowing the allowed memory size, but being unable to change it

在stackoverflow中搜索答案后,我决定处理的唯一问题是与最大允许内存扩展有关的问题。我的问题是,如果有人知道如何插入一个适当的刹车,以防脚本可能失败,由于耗尽内存。

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

现在,回到问题,有人知道如何用安全的方法正确地防止这种错误吗?如果真的有关于这个主题的问题,请链接给我。

问好,

减少程序可能使用的内存量的通常方法是将问题分解为更小的部分,迭代地改进答案,使用磁盘上的文件代替结构体的内存,等等。如果不了解应用程序的细节,就不可能真正建议最佳的方法

但是考虑一下在100kb的内存空间中排序一个100mb的输入文件的任务;您可能会认为,如果不同时存储所有100兆内存,这项任务是不可能完成的。但是,您可以通过许多不同的方法轻松地将这个问题分成更小的部分:

  • 可能将所有以整数0-1000开头的行排序到一个文件中,1001-2000到另一个文件中,2001-3000到第三个文件中,等等。将所有行分隔到不同的文件中后,对每个文件进行排序,然后使用简单的连接合并输入文件。

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

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

或者,如果您的问题是一个大型正则表达式匹配,那么您可能会遇到严重的回溯问题,其中一次存储了太多的状态。您可以转换为不同的匹配操作符,以防止回溯,并可能解决多个匹配的问题。

这取决于你要解决的问题,你如何将它分解成更小的部分,以减少整体内存使用。请注意,许多这些技术可能会增加执行时间,因为它们需要更多的磁盘IO或重新解决本可以保存在内存中的问题。有时它们会加快执行时间,因为处理或保留的数据越少,引用的局部性就越好,缓存也就越好。(这种情况很少见。请参阅Programming Pearls,了解由于更简单的问题解决而加速的一个非常引人注目的案例…)