vk fb tw rss

Многопоточная обработка данных в 1С

Многозадачность

 

Иногда приходится ускорять некоторые операции, которые на первый взгляд ускорить нельзя. Например, загрузку или выгрузку большого объема данных, тут все начинается упираться в производительность железа, и обработки могут занимать часы.
И многие совершенно забывают, что в 1С некоторые операции можно распараллелить, т.е. выполнить их одновременно в несколько потоков.


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

Рассмотрим следующую задачу, допустим необходимо обновить реквизит «Цена» у всех элементов справочника «Товары», при этом в справочнике 100 000 элементов.
Конечно же, можно за 5 минут написать очень простую обработку, но работать она будет довольно долго.

код однопоточного выполнения

В моем случае данный код отработал за 1 187 секунд или 19,7 минуты.

Но есть другой вариант, сделать многопоточное выполнение.
Например, выглядеть такой код может вот так:

код многопоточного выполнения 1


код многопоточного выполнения 2

 

Код общего модуля

код многопоточного выполнения 3

 

В моем случае обработка шла в 8 потоков, и цены обновились за 859 секунд или 14,3 минуты. При этом обработка выполнялась на виртуальной машине с 1 процессором и без всяких RAID массивов. На хорошем железе разница будет заметно больше.
Конечно, можно решать эту задачу разными способами, это лишь один из вариантов реализации.
В данном примере мы просто обрабатываем одну и ту же таблицу значений параллельно разными потоками, в результате получаем выигрыш в скорости. Сразу хочу предупредить что не стоит ставить слишком большое количество потоков, т.к. большого выигрыша вы все равно от этого не получите, а вот стабильность работы может пошатнуться. Лучше ставить максимум 8-10 потоков, оптимальное число обычно определяется экспериментальным путем.
При желании можете провести эксперимент самостоятельно, базу и обработки можно скачать здесь.

 

Понравилась статья? Подпишитесь на новости!



Лучшие материалы по теме

Расскажите своим друзьям
Вам ничего не стоит, а им будет интересно
Подпишитесь на обновления
Ваш e-mail: * Ваше имя: *


Обсудить Вконтакте


Обсудить в Facebook

6 комментариев: Многопоточная обработка данных в 1С

  • Спасибо, интересная идея. Сам об этом не подумал.
    В принципе не только время обработки будет быстрей, но и время блокировки справочника(если его заблокировать на время выполнения обработки).

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

      • Проведение документов вряд ли будет улучшено. С большой долей вероятности регистры будут заблокированы либо на S либо на U. А вот update ссылочных данных, думаю, на ура.
        Данный метод хорош как пример нестандартного применения объекта.
        Спасибо, за статьи.
        Буду ждать новых

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

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

            • Это да, хотя все зависит от организации. Если фирма с большим количеством складов например, то там можно по каждому складу проводить документы в отдельном потоке.
              Хотя конечно по ситуации

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *