2010-07-27 4 views
1

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

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

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

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

+0

Возможно, вам стоит указать, в какой версии ColdFusion вы находитесь. –

+1

Запустите сценарий batch/shell из cfexecute, я лично не считаю, что такая интенсивная работа с памятью должна выполняться внутри CF jvm. Попытка решить проблему, однако, вы должны запустить что-то вроде visualvm, чтобы вы могли понять, где находится память в первую очередь. Тогда могут быть подходы, которые могут его исправить. –

+0

Я запускаю CF8. – dcolumbus

ответ

0

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

Возможно, это стоит сделать в вашем случае.

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

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

Надеется, что это помогает!

+0

в моем опыте, который ничего не сделает. вызывая сборщик мусора, прямо сообщайте JVM о попытке очистить все отброшенные объекты, однако в большинстве случаев ColdFusion не будет отмечать какие-либо объекты как готовые к отбрасыванию до тех пор, пока ПОСЛЕ завершения обработки запроса. – rip747

0

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

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

+0

Веб-сервер - это Linux. – dcolumbus

2

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

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

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

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

+0

Иордания ... Я использую cfexecute, потому что не знаю, как еще запустить скрипт FFMPEG. После загрузки я создаю запись в БД, а затем периодически запускаю задания CRON, которые запускают различные .cfm, чтобы позаботиться о преобразовании и перемещении видео. – dcolumbus

+0

В соответствии с [Будет ли ответ] (http://stackoverflow.com/questions/3340064/coldfusion-cfexecute-ffmpeg-memory-issue#13844258) может потребоваться циклическое и индивидуальное удаление каждого ключа. –

+1

вызов StructDelete или StructClear может удалить ссылку на переменную из ColdFusion, но ничего не сделает для освобождения памяти для JVM. JVM может восстанавливать память только от ColdFusion ПОСЛЕ того, как запрос обрабатывается. – rip747

3

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

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

Будет ли, нет необходимости/полезно указать третий аргумент [StructDelete] (http://cfdocs.org/StructDelete) здесь. Просто 'StructDelete (Request, mydex)' будет работать точно так же. (WTF - «mydex», хотя !?) –

0

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

https://github.com/rip747/cfffmpeg

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

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

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

Опять же, этот подход входит в DSL.

+0

Возможно, потому что вопрос был задан 2 года назад, и ваш код был выпущен 11 месяцев назад. :) –

+0

Также, где в коде есть исправление памяти? Я не мог найти его. –

+0

go рис. интересно, почему тогда это появилось в моем читателе Google. о, хорошо моя ошибка. для исправления, посмотрите на этот файл: https://github.com/rip747/cfffmpeg/blob/master/src/convert/process.cfm – rip747

Смежные вопросы