ColdFusion: проблема с памятью CFEXECUTE / FFMPEG? - PullRequest
1 голос
/ 27 июля 2010

Таким образом, мое приложение позволяет пользователям загружать видео, конвертировать его с помощью FFMPEG и затем передавать его на сервер Flash Media Server. В последнее время я столкнулся с проблемой.

Если при конвертации видео возникает ошибка, я автоматически генерирую отчет cfcatch PDF. На этот раз я столкнулся с ошибкой «Не удается выделить память». Это сильно беспокоит меня, потому что я собираюсь продвигать свою систему и не могу позволить сценариям перестать работать в течение первых нескольких часов.

Есть ли способ устранить проблемы с памятью с ColdFusion? Я имею в виду, как только работа будет выполнена, могу ли я по существу "сбросить" память, которую использовал сервер?

Если вы понимаете потенциальную катастрофу, я уверен, вы поймете, почему я должен выяснить, как убедиться, что мои сценарии выполняются правильно. Физическое исправление - перезапустить сервер, но я, очевидно, не могу перезапускать сервер каждый раз, когда пользователь загружает видео ...

Ответы [ 5 ]

3 голосов
/ 12 декабря 2012

Отличный ответ, но я не смог заставить твой сценарий работать так, чтобы его снова трогали и какая разница !!!

<cfloop collection="#REQUEST#" item="mydex">
    <cfset StructDelete(REQUEST, "#mydex#", "True")>
</cfloop>
<cfloop collection="#VARIABLES#" item="mydex">
    <cfset StructDelete(VARIABLES, "#mydex#", "True")>
</cfloop>
2 голосов
/ 10 августа 2010

Я помню, что читал, что некоторые серверные версии неправильно распределяют COM-объекты и т. П., Когда завершается запрос страницы.Если все это выполняется с помощью класса CFC или Java, для которого задана переменная, вы можете поместить это в OnRequestEnd.cfm:

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

Это избавит от любых переменных, установленных на странице, которыебольше не нужны.Не должно иметь никаких негативных побочных эффектов, и должно очистить любую память, которая все еще может скрываться в одной из переменных, установленных во время обработки этой страницы.

Вы также можете использовать что-то отличное от * 1007.* для обработки видео.Может быть, есть фоновый процесс, который регулярно проверяет папку на наличие видео, а затем конвертирует их в фоновом режиме?ColdFusion не обязательно эффективен, когда дело доходит до пакетной обработки.

0 голосов
/ 13 декабря 2012

Я не понимаю, почему в мире вы пытаетесь изобретать колесо, когда я написал оболочку DSL для FFMPEG с исправлением утечки памяти:

https://github.com/rip747/cfffmpeg

Форк и отправьте любые улучшения или исправления, которые вы хотите.

Кстати, если вы хотите узнать, как на самом деле решать проблемы с памятью, которые у вас есть, то прочитайте статью CFSEARCHING:

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

Опять же, этот подход включен в DSL.

0 голосов
/ 02 августа 2010

Если вы работаете в Windows, я рекомендую вызвать пакетный файл, чтобы выполнить преобразование и передачу файла.Вы можете выполнить командный файл из CF.Это предотвратит использование CF всей памяти для преобразования, и задача может продолжаться в фоновом режиме.Если вы хотите подождать, чтобы получить статус, добавьте «таймер», используя экземпляр объекта Java Java CF, чтобы проверить статус через X секунд.

или вы можете вызвать окно cmd для его запуска - http://www.forta.com/blog/index.cfm/2006/7/31/Using-CFEXECUTE-To-Execute-Command-Line-Utilities

0 голосов
/ 28 июля 2010

Я сталкивался с некоторыми случаями, когда полезно вручную запускать сборку мусора JVM изнутри CF, как правило, когда долго выполняющийся поток выполняет долгосрочное управление очередью, а запрос очень долго выполняется.

Возможно, в вашем случае стоит попробовать.

Чтобы запустить сборщик мусора из CF, вы звоните по следующему номеру:

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...