【问题标题】:ColdFusion: CFEXECUTE/FFMPEG Memory Issue?ColdFusion:CFEXECUTE/FFMPEG 内存问题?
【发布时间】:2010-07-27 01:02:01
【问题描述】:

所以我的应用程序允许用户上传视频,使用 FFMPEG 对其进行转换,然后将其传输到 Flash Media Server。最近,我遇到了一个问题。

如果在转换视频时出现错误,我会自动生成 cfcatch 报告 PDF。这次我遇到了“无法分配内存”错误。这让我非常担心,因为我即将推出我的系统,而且我无法承受脚本在最初的几个小时内停止运行。

有没有办法清理 ColdFusion 的内存问题?我的意思是,一旦工作完成,我可以从本质上“重置”服务器正在使用的内存吗?

如果您了解潜在的灾难,我相信您会理解为什么我必须找出如何确保我的脚本正确执行。物理修复是重新启动服务器,但我显然不能每次用户上传视频时都重新启动服务器......

【问题讨论】:

  • 也许您应该指定您使用的 ColdFusion 版本。
  • 从 cfexecute 运行批处理/shell 脚本,我个人认为这种内存密集型操作不应该在 CF jvm 中完成。不过,为了解决这个问题,您应该运行类似 visualvm 的东西,这样您就可以了解首先保存内存的位置。那么可能有一些方法可以解决它。
  • 戴夫,你建议如何完成这样的任务?

标签: memory video ffmpeg coldfusion cfexecute


【解决方案1】:

很好的答案,但我无法让你的脚本工作得如此重新润色,这有什么不同!!!

<cfloop collection="#REQUEST#" item="mydex">
    <cfset StructDelete(REQUEST, "#mydex#", "True")>
</cfloop>
<cfloop collection="#VARIABLES#" item="mydex">
    <cfset StructDelete(VARIABLES, "#mydex#", "True")>
</cfloop>

【讨论】:

  • 威尔,这里没有必要/好处指定StructDelete的第三个参数。只是StructDelete(Request,mydex) 将完全一样。 (虽然 WTF 是“mydex”!?)
【解决方案2】:

我记得读过一些服务器版本在页面请求完成时没有正确处理 COM 对象等。如果其中任何一项是通过设置为变量的 CFC 或 Java 类完成的,您可以将其放入 OnRequestEnd.cfm

<cfset StructDelete(variables)>
<cfset StructDelete(request)>

这将删除页面上不再需要的所有变量。不应该有任何负面影响,并且应该清除在处理该页面期间可能仍潜伏在其中一个变量中的任何内存。

您也可以考虑使用&lt;cfexecute&gt; 以外的其他方式来处理视频。也许有一个后台进程会定期检查文件夹中的视频,然后在后台转换它们?在批处理方面,ColdFusion 不一定高效。

【讨论】:

  • Jordan... 我正在使用 cfexecute 因为我不知道如何运行 FFMPEG 脚本。上传后,我在数据库中创建一条记录,然后定期运行运行各种 .cfm 的 CRON 作业来处理视频的转换和移动。
  • 根据Will's answer,可能需要逐个循环并删除每个键。
  • 调用 StructDelete 或 StructClear 可能会从 ColdFusion 中删除对变量的引用,但不会为 JVM 释放内存。 JVM 只能在处理完请求后从 ColdFusion 中回收内存。
  • @rip747 假设有某种智能垃圾收集器正在运行,如果问题是对象没有被处理,我猜一旦 CF 处理了对象,那么 JVM 就会清除内存指向引用的对象。还是我错过了什么?
【解决方案3】:

我遇到过一些从 CF 中实际手动运行 JVM 垃圾收集很有帮助的实例,通常是当有一个长时间运行的线程在执行长期队列管理并且请求运行时间很长时。

在您的情况下可能值得一试。

要从 CF 中运行垃圾收集器,请调用以下命令:

<cfset runtime = CreateObject("java", "java.lang.Runtime").getRuntime()>
<cfset runtime.gc()>

希望对你有帮助!

【讨论】:

  • 根据我的经验,这绝对不会做任何事情。调用垃圾收集器直接告诉 JVM 尝试清理所有丢弃的对象,但是在大多数情况下,ColdFusion 不会将任何对象标记为准备被丢弃,直到处理完请求之后。
【解决方案4】:

如果您在 Windows 上,我建议调用批处理文件来进行转换和文件传输。您可以从 CF 执行批处理文件。这将防止 CF 为转换消耗整个内存,并且任务可以继续在后台运行。如果您想等待获取状态,请使用 CF Java 对象实例化添加一个“计时器”,以在 X 秒后检查状态。

或者你可以调用一个 cmd 窗口来运行它 - http://www.forta.com/blog/index.cfm/2006/7/31/Using-CFEXECUTE-To-Execute-Command-Line-Utilities

【讨论】:

    【解决方案5】:

    我不明白,当我为 FFMPEG 编写 DSL 包装器并修复其中包含的内存泄漏时,你为什么要重新发明轮子:

    https://github.com/rip747/cfffmpeg

    派生并提交您想要的任何增强或修复。

    顺便说一句,如果您想了解如何真正处理您遇到的内存问题,请阅读 CFSEARCHING 的文章:

    http://cfsearching.blogspot.com/2007/12/using-ffmpeg-to-convert-video-files-to.html

    同样,这种方法包含在 DSL 中。

    【讨论】:

    • 可能是因为这个问题是在 2 年前提出的,而您的代码是在 11 个月前提供的。 :)
    • 另外,内存修复在代码的什么地方?我没找到。
    • 去图。想知道为什么它会出现在我的谷歌阅读器中。哦,我的错。如需修复,请查看此文件:github.com/rip747/cfffmpeg/blob/master/src/convert/process.cfm
    猜你喜欢
    • 2021-12-05
    • 2015-06-03
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多