因此,我的应用程序允许用户上传视频,使用FFMPEG进行转换,然后将其传输到Flash Media Server。最近,我遇到了一个问题。
如果转换视频时出现错误,我会自动生成cfcatch报告PDF。这次我遇到了“无法分配内存”的错误。这让我非常担心,因为我要宣传我的系统,我不能让脚本在最初的几个小时内停止运行。
有没有办法清理ColdFusion的内存问题?我的意思是,一旦工作完成,我可以基本上“重置”服务器正在使用的内存吗?
如果您了解潜在的灾难,我相信您会理解为什么我必须找出如何确保我的脚本正确执行。物理修复是重启服务器,但显然每次用户上传视频时都无法重启服务器......
答案 0 :(得分:3)
很好的答案,但我无法让你的剧本工作,所以重新触摸,有什么不同!!!
<cfloop collection="#REQUEST#" item="mydex">
<cfset StructDelete(REQUEST, "#mydex#", "True")>
</cfloop>
<cfloop collection="#VARIABLES#" item="mydex">
<cfset StructDelete(VARIABLES, "#mydex#", "True")>
</cfloop>
答案 1 :(得分:2)
我记得在页面请求完成时,某些服务器版本没有正确处理COM对象等。如果通过设置为变量的CFC或Java类完成任何操作,可以将其放在OnRequestEnd.cfm
中:
<cfset StructDelete(variables)>
<cfset StructDelete(request)>
这将消除页面上设置的不再需要的变量。不应该有任何负面的副作用,并且应该清除在处理该页面期间设置的一个变量中可能仍然潜伏的任何内存。
您可能还会考虑使用<cfexecute>
以外的其他内容来处理视频。也许有一个后台进程,经常检查文件夹中的视频,然后在后台转换它们?在批量处理方面,ColdFusion不一定有效。
答案 2 :(得分:0)
我遇到过一些实例,从CF内部实际手动运行JVM垃圾回收是有帮助的,通常是在长时间运行的线程进行长期队列管理并且请求运行时很长。
在您的情况下可能值得一试。
要从CF中运行垃圾收集器,请调用以下命令:
<cfset runtime = CreateObject("java", "java.lang.Runtime").getRuntime()>
<cfset runtime.gc()>
希望它有所帮助!
答案 3 :(得分:0)
如果你在Windows上,我建议调用批处理文件来进行转换和文件传输。您可以从CF执行批处理文件。这将阻止CF使用整个内存进行转换,并且任务可以继续在后台运行。如果您想等待获取状态,请使用CF Java对象实例化添加“计时器”以在X秒后检查状态。
或者您可以调用cmd窗口来运行它 - http://www.forta.com/blog/index.cfm/2006/7/31/Using-CFEXECUTE-To-Execute-Command-Line-Utilities
答案 4 :(得分:0)
我不明白为什么在我为FFMPEG编写DSL包装器时,你正试图重新发明轮子,并修复了内存泄漏:
https://github.com/rip747/cfffmpeg
分叉并提交您想要的任何增强或修复。
顺便说一句,如果你想了解如何真正处理你所遇到的内存问题,请阅读CFSEARCHING的文章:http://cfsearching.blogspot.com/2007/12/using-ffmpeg-to-convert-video-files-to.html
同样,这种方法也包含在DSL中。