Как я могу ускорить процесс пакетной обработки в Coldfusion? - PullRequest
4 голосов
/ 14 июля 2009

Каждый раз в какое-то время я получаю большой файл данных, который загружает мой клиент и который должен быть обработан через CMFL. Проблема заключается в том, что если я помещаю обработку на страницу CF, то через 120 секунд возникает проблема тайм-аута. Мне удалось переместить код обработки в CFC, где, по-видимому, нет проблемы с тайм-аутом. Однако иногда во время обработки происходит сбой ColdFusion, и он должен быть перезапущен. Для каждой строки (8 000+) файла, через который я прохожу, требуется несколько запросов к базе данных (5 или более, смесь обновлений и выборок), а также другая логика, предоставленная мной в форме CFML.

Мой вопрос: как лучше всего пройти этот файл? Одно предостережение: я не могу переместить файл на сервер базы данных и полностью обработать его с помощью БД. Однако будет ли эффективнее передавать каждую строку хранимой процедуре, которая позаботится обо всем? Было бы еще много обращений к базе данных, но ничто по сравнению с тем, что я имею сейчас. Кроме того, как лучше всего предоставить пользователю обратную связь о том, сколько файлов было обработано?

Edit: Я бегу CF 6,1

Ответы [ 7 ]

6 голосов
/ 14 июля 2009

Я только что сделал подобное и часто использую CF для анализа данных.

1) Ведение таблицы загрузки файлов (родительская таблица). Для каждого загружаемого файла вы должны иметь возможность хранить список каждого файла и состояние, в котором он находится (загружен, обработан, необработан)

2) Временная таблица для хранения всех строк файла данных. (дочерняя таблица) Импорт всего файла данных во временную таблицу. Попытка сделать все это в памяти неизбежно приведет к некоторым ошибкам. Каждая строка в этой таблице будет ссылаться на запись таблицы загрузки файлов выше.

3) Сохранение статуса обработки - Для каждой строки файла данных, который вы вводите, установите тег «process / unprocessed». Таким образом, если он сломается, вы можете начать с того места, где остановились. Когда вы пробегаете каждую строку, установите ее как «обработанную».

4) Транзакция - используйте cftransaction, если это возможно, чтобы зафиксировать все сразу или хотя бы по одной строке за раз (с вашими 5 запросами). Таким образом, если что-то произойдет, у вас не будет ни одной строки данных, которая была бы наполовину вычислена / обработана / обновлена ​​/ протестирована.

5) Как только вы закончите обработку, установите запись имени файла в таблице на шаге 1, чтобы она была «обработана»

Используя описанный выше подход, если что-то не получается, вы можете настроить его так, чтобы оно начиналось с того места, где оно остановилось, или, по крайней мере, иметь более четкий путь, с которого следует начинать расследование, или очистить данные в худшем случае. У вас будет четкий способ отображения пользователю статуса текущей обработки загрузки, где она находится и где остановилась в случае ошибки.

Если у вас есть какие-либо вопросы, дайте мне знать.

Другие мысли:

  1. Вы можете увеличить тайм-ауты, дать ВМ больше памяти, перевести ее в 64-битный режим, но все это только увеличит емкость вашей системы. Это хорошая идея, чтобы сделать это за вызов и сделать это в сочетании с вышеуказанным.

  2. В Java есть несколько удобных библиотек обработки файлов, которые доступны как CFCS. если вы столкнулись со многими проблемами со скоростью, вы можете использовать одну из них, чтобы прочитать ее в переменную, а затем в базу данных

  3. Если вы играете с XML, не используйте разбор xf Coldfusion. Он хорошо работает для небольших файлов и подходит, когда все становится больше. Есть несколько написанных cfc (проверьте riaforge и т. Д.), Которые обертывают несколько превосходных библиотек java для анализа XML-данных. Затем вы можете вручную создать cfquery с этими данными.

4 голосов
/ 14 июля 2009

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

Первое, с таким количеством операций с базами данных, возможно, вы генерируете слишком много отладки. Убедитесь, что в разделе «Настройки отладочного вывода» в администраторе следующие параметры отключены.

  • Включить надежную информацию об исключениях
  • Включить окно журнала отладки AJAX
  • Запрос результатов отладки

Второе, что я хотел бы сделать, - посмотреть на эти запросы к БД и убедиться, что они оптимизированы. Убедитесь, что выбор происходит с указателями и т. Д.

Третье, что я подозреваю, это то, что файл висит в памяти, вероятно, неоптимальный.

Я бы попробовал перебрать файл с помощью зацикливания файла:

<cfloop file="#VARIABLES.filePath#" index="VARIABLES.line">
    <!--- Code to go here --->
</cfloop>
1 голос
/ 15 июля 2009

Вы пробовали шлюз событий? Я полагаю, что на эти потоки не распространяются те же параметры тайм-аута, что и на потоки запросов страниц.

0 голосов
/ 19 октября 2009

Мне пришлось сделать то же самое, Бен Надель написал кучу замечательных статей, использующих java-файл io, чтобы позволить вам быстрее читать файлы, записывать файлы и т. Д. *

Действительно помог улучшить производительность нашего приложения импорта CSV.

0 голосов
/ 15 июля 2009

В настоящее время шлюз событий - это единственный способ обойти ограничения времени ожидания цикла HTTP-запроса. CF не имеет способ обрабатывать CF-страницы в автономном режиме, то есть, нет вызова из командной строки (одна из моих самых больших проблем в CF - очень небольшая обработка).

Лучше всего использовать шлюз событий или переписать логику синтаксического анализа на прямой Java.

0 голосов
/ 14 июля 2009

Если вы можете выполнить обновление до cf8 и воспользоваться преимуществом cfloop file = "", которое увеличит скорость и файл не будет помещен в память (что, вероятно, является причиной сбоя).

В зависимости от ситуации, с которой вы столкнулись, вы также можете использовать cfthread для ускорения обработки.

0 голосов
/ 14 июля 2009

Службы интеграции SQL Server (SSIS) - это рекомендуемый инструмент для сложной работы ETL (извлечения, преобразования и загрузки), как это звучит. (Его можно настроить для доступа к файлам на других серверах.) Может возникнуть вопрос, можете ли вы настроить интерфейс между Cold Fusion и SSIS?

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