SSIS: способ обработки горячих папок параллельно? - PullRequest
0 голосов
/ 26 апреля 2010

У нас есть восемь ядер Xeon (i7) и 16 гигабайт оперативной памяти на нашей коробке SSIS. У нас есть около 200 файлов изображений, которые мы хотим конвертировать с помощью утилиты командной строки каждый день. В настоящее время процесс использует Adobe Photoshop и капли (очень ручной, занимающий более двух часов в день)

Используя горячие папки служб SSIS, можно ли выполнить до восьми преобразований одновременно?
Есть ли способ сообщить о завершении процесса или выполнить код после его завершения?

Ответы [ 2 ]

1 голос
/ 29 апреля 2010

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

Вот как бы я это сделал:

На вашей панели управления:

Контейнер цикла ForEach (FELC)

  • Настроендля просмотра вашей «горячей папки»

  • Внутри этого контейнера задание файловой системы для перемещения файлов в
    обрабатывающих папок.

  • Переменная, установленная из FELC, чтобы получить имя файла для действия.(Я использовал USER :: HotFolderFilePath)

  • Вторая переменная, содержащая пункт назначения для перемещения.(Я использовал USER :: DestPath)

  • Задача «Сценарий» для изменения имени папки назначения после каждой итерации

    Импорт системы
    Импорт системы.Data
    Импортирует System.Math
    Импортирует Microsoft.SqlServer.Dts.Runtime

    Открытый класс ScriptMain

    Public Sub Main()
    
        Select Case Dts.Variables("User::DestPath").Value.ToString
            Case "E:\Processing\ProcFolder7"
                Dts.Variables("User::DestPath").Value = "E:\Processing\ProcFolder8"
            Case "E:\Processing\ProcFolder6"
                Dts.Variables("User::DestPath").Value = "E:\Processing\ProcFolder7"
            Case "E:\Processing\ProcFolder5"
                Dts.Variables("User::DestPath").Value = "E:\Processing\ProcFolder6"
            Case "E:\Processing\ProcFolder4"
                Dts.Variables("User::DestPath").Value = "E:\Processing\ProcFolder5"
            Case "E:\Processing\ProcFolder3"
                Dts.Variables("User::DestPath").Value = "E:\Processing\ProcFolder4"
            Case "E:\Processing\ProcFolder2"
                Dts.Variables("User::DestPath").Value = "E:\Processing\ProcFolder3"
            Case "E:\Processing\ProcFolder1"
                Dts.Variables("User::DestPath").Value = "E:\Processing\ProcFolder2"
            Case Else
                Dts.Variables("User::DestPath").Value = "E:\Processing\ProcFolder1"
        End Select
        Dts.TaskResult = Dts.Results.Success
    End Sub
    

    Конечный класс

  • После ForEachКонтейнер цикла завершен, у вас есть 8 папок, каждая из которых содержит несколько файлов.

  • На этом этапе создайте по одному новому контейнеру циклов ForEach для каждой из папок обработки и обработайте его, как вы делали это в исходной «горячей папке», поскольку все они связаны на вашей панели управления с исходнымFELC, от этого вы получите некоторую степень согласованности.Возможно, вам придется поиграть со свойством пакета «max одновременных исполняемых файлов».Обычно это значение равно -1, что позволяет серверу Sql определять максимальное значение на основе ресурсов сервера.
0 голосов
/ 01 мая 2010

Если под «горячими папками» вы имеете в виду папки, которые будут отслеживать SSIS, вы можете попробовать использовать FileWatcher с sqlis.com. Эта утилита будет сидеть и ждать, пока файл будет помещен в наблюдаемую папку. Он может использовать подстановочные знаки, но не очень сложные. Я вижу, вы хотите обработать более 200 изображений, но я не вижу, во сколько «папок» будут помещены эти изображения. Если они помещаются в одну папку, вы можете использовать технику, которую я использую для параллельной обработки .pdfs. У меня есть задача «Сценарий», прочитанная с полным именем файла (включая каталог) в плоский файл, поэтому в конце я получаю что-то похожее на это:

  1. C: \ RootFolder \ изображения \ image1.png
  2. C: \ RootFolder \ изображения \ image2.png
  3. C: \ RootFolder \ образы \ image3.png

Затем я загружаю это в sql 'Task' таблицу как поле varchar (x). В моем случае 8, параллельные задачи потока данных, каждая из которых извлекает одну строку из таблицы. Я обрабатываю pdf-файлы счетов-фактур и делаю это за тысячи минут. Разработанный мной процесс предотвращает узкие места, поскольку все N потоков извлекаются из одного источника. Если вы решите, чтобы N задач извлекалось из N файлов, произойдет изменение, и одна или несколько из этих задач потока данных будут отставать, задерживая весь процесс. Мне некуда публиковать код, который я использую, но я был бы более чем счастлив выслать его вам вместе с презентацией о параллельной структуре задач. Просто отправьте мне письмо.

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