【问题标题】:Very Long Running Script in CodeIgniter Slowing Dramatically After 90 MinutesCodeIgniter 中非常长的运行脚本在 90 分钟后显着减慢
【发布时间】:2012-10-23 14:39:38
【问题描述】:

我有一个运行时间很长的脚本,它正在对大约 3000 万条数据库记录执行大量工作。每次我用 CLI 启动它并让它运行时,考虑到它正在做的工作量(大约 5k 条记录/分钟),它运行得相当快。然而,大约 90 分钟后,它的速度急剧下降,需要 2 小时才能完成 5k 条记录。如果我重新启动它,它会再次正常运行大约 90 分钟。

Apache 日志在速度变慢时没有显示任何内容,我只是不知道还能去哪里查看。

在命令行上运行,PHP 的最大执行时间应该无关紧要,我已经在 CodeIngiter 中注释掉了将其设置为 300 的位置;我什至在脚本顶部添加了set_time_limit(0)

我的数据库是 PostgreSQL。

关于去哪里看有什么建议吗?

编辑:好的,肯定是内存问题。但是我正在使用几个数组来缓存结果以进行批量插入和更新,但是我在之后清除它们并且在我达到 90 分钟标记之前它们被使用了很多次。

有没有办法查看当前内存中的内容?

编辑:我不知道这是否是我的解决方案再过 90 分钟,但如果您是有内存问题的 CI 用户,请查看此http://codeigniter.com/forums/viewthread/140012/#689396

【问题讨论】:

  • 试着把它分成几部分。检查使用的内存,一段时间后似乎正在进行大量交换。
  • 性能会在 90 分钟后急剧下降,还是会逐渐下降?无论如何,作为 Apache 孩子,您不应该执行长时间运行的脚本。
  • 我同意@MarcB:您不应该通过 Apache 访问它,尤其是因为您可能正在使用 PHP 的 CLI 版本。
  • @MarcB 悬崖边。我想现在我想它实际上并没有使用 apache。我只是用 php index.php 等来调用它。
  • 听起来你像 s**t 一样泄漏内存。生活很艰难。死亡和重生是有原因的。如果你找不到你的泄漏,你可以批量处理你的过程来使用童工来做,比如说,1M 记录砖,这样图像关闭/重启就可以解决你的泄漏问题。

标签: php apache codeigniter


【解决方案1】:

你可以通过这个函数memory_get_usage()查看你的内存使用情况。

您可以在内存中看到的唯一内容是您已删除的数组或变量。任何已被unset()、重用或无效的内容都会被垃圾收集器添加以供删除。


我以前做过 PHP 导入脚本,您可能遇到的是内存问题。完成后请务必清空数组。

根据您希望在任务中获得多少乐趣,这可能会激发您的兴趣: http://gearman.org/

Gearman 提供了一个通用的应用程序框架,将工作分包给更适合完成工作的其他机器或进程。

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多