【问题标题】:PHP CLI running out of memoryPHP CLI 内存不足
【发布时间】:2016-08-24 02:11:25
【问题描述】:

我正在尝试使用来自https://github.com/Blogestudio/Fix-Serialization/blob/master/fix-serialization.php 的 fix-serialization.php 文件重新序列化 1gb sql 转储

使用这个命令:

php -d memory_limit=-1 fix-serialization.php dump.sql 

但我收到以下错误

PHP Fatal error:  Out of memory (allocated 2328100864) (tried to allocate 18446744071742389167 bytes) 

我在尝试时遇到了同样的错误:

php -d memory_limit=2000M fix-serialization.php dump.sql 

显然我的电脑没有 18446744071 GB 的内存。我在 MBP 和我的 Ubuntu 机器上都遇到了这个错误,我尝试在 php5.6 和 7 上运行这个脚本

【问题讨论】:

标签: php memory


【解决方案1】:

看来您应该制定自己的解决方案。该脚本不适合,因为它一次读取整个文件,然后将整个文件传递给 preg_replace。该正则表达式非常复杂,因此需要大量内存来处理如此大的字符串。 您应该read one data line,然后proccess 该行并将其写入输出文件。 Open 输入文件用于读取,输出文件用于写入,因此数据不会损坏。

【讨论】:

  • 那么当逐行读取文件时(在同一个脚本中)内存使用减少了?所以内存只在每行运行正则表达式时分配,而不是为整个脚本累积?
  • 是的,当打开任何大小的文件时,只会为句柄资源分配少量内存。当您读取一行时,该数据存储在一个变量中。
  • 我太棒了。好的,我将使用该正则表达式并尝试在每行的基础上针对转储运行它。
  • 请注意:这种方法只有在每一行都可以自己处理的情况下才能采用,如果处理需要更广泛的上下文,则应该使用更复杂的方法。
  • 这很完美,我重写了脚本以逐行运行正则表达式,它可以工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2015-08-13
  • 1970-01-01
  • 2020-01-08
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多