Имя: Пароль:
1C
1С v8
Ускорить СтрЗаменить
,
0 dobrotank
 
23.06.20
17:22
Пишу интеграционный модуль в виде внешней обработки. Столкнулся с тем, что при увеличении объёма данных сильно падает производительность. Сделал замер производительности и по нему получилось, что больше всего времени занимают процедуры и функции с использованием СтрЗаменить. Как можно ускорить замену символов в строках? Регулярные выражения не предлагать, производительность только падает.
1 dka80
 
23.06.20
17:33
Возможно подготовить данные таким образом, чтобы не использовать СтрЗаменить? и почему так много стрзаменить?
2 mikecool
 
23.06.20
18:03
(0) используй питон, Люк
3 lodger
 
23.06.20
18:26
(0) сменить логику на меньшее число вызовов СтрЗаменить.
4 Конструктор1С
 
23.06.20
18:30
(0) небось СтрЗаменить используешь для строки длиною в два тома войны и мира?
5 dobrotank
 
23.06.20
18:49
(4) Нет, дружок, для коротких строк.
6 H A D G E H O G s
 
23.06.20
18:52
Чет не верю. Давайте скриншот
7 Конструктор1С
 
23.06.20
18:54
(5) очень странно. Если не использовать длинющие строки, то нужно постараться, чтобы сделать строковые функции узким местом
8 lodger
 
23.06.20
18:56
(7) если завернуть цикл в цикл в цикл, каждый по тыщщестрок, то можно добиться замедления.
9 dobrotank
 
23.06.20
18:56
(6) Здравствуйте, я тоже атеист.
А по теме писать можно или ты так, "поневерить" зашёл, Ёзжик с Ошибкой?
10 dobrotank
 
23.06.20
18:57
(7) Сам в шоке. До замера грешил на конкатенацию, но не оно.
11 Конструктор1С
 
23.06.20
19:01
(10) какой формат должен получиться на выходе?
12 dobrotank
 
23.06.20
19:01
(8) Что-то похожее и получилось, около 300 тысяч строк в итоговом файле, на каждую строку минимум раз, а то и 5 СтрЗаменить.
13 dobrotank
 
23.06.20
19:01
(11) Текст.
14 Конструктор1С
 
23.06.20
19:04
(13) это понятно, структура какая? XML, JSON, CSV, YAML...?
15 dobrotank
 
23.06.20
19:05
JSON
16 ДенисЧ
 
23.06.20
19:06
(12) Пристрелить.
17 H A D G E H O G s
 
23.06.20
19:07
(16) Этот парень был из тех, кто просто любит жись.
18 Конструктор1С
 
23.06.20
19:08
(12) покажи как формируешь строки
19 nicxxx
 
23.06.20
19:08
(12) Регулярные выражения может стоит попробовать?
20 H A D G E H O G s
 
23.06.20
19:10
(19) Стоит попробовать пройтись 1 раз по итоговому тексту и собрать итоговую строку из массива кусков, возникших при замене через СтрСоединить()
21 Мимохожий Однако
 
23.06.20
19:10
(19) У него вера в то, что регулярка не поможет. Он так и написал : "не предлагать"
22 acht
 
23.06.20
19:11
(16) из тюльпана

(10) погреши еще на неявное приведение типов, погромистик. Ссылки к строке там и все такое.
23 H A D G E H O G s
 
23.06.20
19:13
Автор вступил на скользкую тропинку, на которой можно получить Орден ЛивингСтара.
24 nicxxx
 
23.06.20
19:15
(21) не дочитал до этого места :)
25 Djelf
 
23.06.20
19:19
Интеграционный модуль чего? Сферического коня в вакууме?
А как насчет того чтобы вообще от этого избавится?
Зачем 100500 раз преобразовывать одно и то де, если это преобразование можно где-то сохранить?
26 acht
 
23.06.20
19:32
Кажись и правда ТС пристрелили...

Эх, а я только хотел узнать почему на него очень сильно повлияла серия книг "Хроника Страны Мечты" писателя современности Эдуарда Веркина. Особенно вторая книга.
27 МихаилМ
 
23.06.20
19:40
(0)
чистая статистика
платформа 1с8 может вполне быстро сформировать 300к строк текста.
80 процентов спрашивающих на форуме - полные идиоты. отсюда и недоверие к сказанному.
если у Вас увеличением объема обрабатываемых данных нелинейно увеличивается время обработки
то Вы не умеете мыслить категориями множеств. те в работе в бд - дилетант.

Попробуйте привести участки "медленного" кода.
НО будьте готовы  к критике.
28 NorthWind
 
23.06.20
21:56
(0) О чем идет речь? Если юзаются действительно большие объемы текста, то СтрЗаменить "в лоб" юзать нельзя. Есть специальные алгоритмы представления и работы с большими строками, можно погуглить rope. Возможно, придется отказаться от 1С в пользу чего-то более быстрого.
29 H A D G E H O G s
 
23.06.20
22:19
(28) А давай проверим?
30 xXeNoNx
 
23.06.20
22:21
>> Регулярные выражения не предлагать, производительность только падает. - хм, какие Ваши доказательства (с) Терминатор Арни
31 H A D G E H O G s
 
23.06.20
22:22
Вот есть у нас кусок кода, который создает полгиговый текстовый файл:
&НаКлиенте
Процедура ПодготовитьФайл(Команда)
    Данные="Вы полны идиотских стереотипов"+Символы.ПС;
    МассивСтрок=Новый Массив;
    Для Счетчик=1 По 10000000 Цикл
        МассивСтрок.Добавить(Данные);
    КонецЦикла;
    Результат=СтрСоединить(МассивСтрок);
    Запись=Новый ЗаписьТекста("e:\tmp1\data.txt",КодировкаТекста.UTF8);
    Запись.Записать(Результат);
    Запись.Закрыть();    
КонецПроцедуры

И вот кусок кода с заменой символа на 1С и замером миллисекунд:
&НаКлиенте
Процедура ВыполнитьЗамену(Команда)
    Чтение=Новый ЧтениеТекста("e:\tmp1\data.txt",КодировкаТекста.UTF8);
    Результат=Чтение.Прочитать();
    ВремяНачала=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Результат=СтрЗаменить(Результат," ","_");
    ВремяОкончания=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Выполнено за: "+Строка(ВремяОкончания-ВремяНачала));
КонецПроцедуры

И вот кусок кода с заменой символа на Delphi и замером миллисекунд:
procedure TForm1.Button1Click(Sender: TObject);
var
  Чтение: TStringStream;
  Результат: String;
  ВремяНачала: Cardinal;
  ВремяОкончания: Cardinal;
begin
  Чтение := TStringStream.Create();
  Чтение.LoadFromFile('E:\tmp1\data.txt');
  Результат := Чтение.DataString;
  ВремяНачала := GetTickCount;
  Результат := StringReplace(Результат, ' ', '_', [rfReplaceAll]);
  ВремяОкончания := GetTickCount;
  ShowMessage('Выполнено за: ' + inttostr(ВремяОкончания - ВремяНачала));
end;

В 1С замена в полгиговом тексте выполняется за "Выполнено за: 945"
В Delphi замена в полгиговом тексте выполняется за "Выполнено за: 828"
32 xXeNoNx
 
23.06.20
22:24
(0) Рома штоль ссыкует?
33 H A D G E H O G s
 
23.06.20
22:32
Меня забавляют эти люди.
Они живут в своем мире, пишут "не лучшие" алгоритмы, а потом открывают для себя SQL, который вывезет почти любую копроархитектуру запросов за счет своих оптимальных алгоритмов.
И они начинают считать SQL волшебным ящиком. И херачить в него любую дичь, временные таблицы из ТЗ, вот это все. Потом они открывают для себя индексы. И они решают, что волшебный ящик то с волшебной палочкой и начинают херачить индексы везде. Даже не задумываясь, что волшебства не бывает.
Так и тут. Волшебства нет, на каком бы языке ЯП ты не написал код, использовал ли регулярные выражения, процессору нужно пройти хотя бы 1 раз все эти полгига памяти.
34 xXeNoNx
 
23.06.20
22:49
(27) тож интеграционный мегамодуль, вдруг сопрешь...
>> Вы не умеете мыслить категориями множеств. те в работе в бд - а обработка текста тут к чему?
35 МихаилМ
 
23.06.20
23:53
(34)
проблема одинесников в видении обработки данных построчно и по-элементно. если "видеть" структуры данных шире, то будут совсем другие алгоритмы и способы их реализации в 1с.
36 xXeNoNx
 
24.06.20
00:09
(35) в целом, если мыслить шире-обширно, то будет больше профита
37 МихаилМ
 
24.06.20
00:10
(33) технологии развиваются и не за горами та времена, когда быстродействие вт позволит фигачить самые убогие алгоритмы на 1с.
но пока бизнес требует уточнения модели . и усложнения точности и структур данных.
38 H A D G E H O G s
 
24.06.20
00:12
(37) Я не готов воспринимать ваши сообщения всерьез, поэтому писать мне бессмысленно, я в будущем не отвечу.
39 Злопчинский
 
24.06.20
00:13
(37) а че так 8-ка мрачно ворочается? сил вт не хватает? или с 8-кой что-то не так?
40 Злопчинский
 
24.06.20
00:14
(35) "в видении обработки данных построчно и по-элементно. если "видеть" структуры данных шире, то будут совсем другие алгоритмы и способы их реализации в 1с."
- такие ширшее алгоритмы требуют другого подхода в первую очередь к генерации исходных данных.
41 H A D G E H O G s
 
24.06.20
00:16
(39) 8-ка мрачно ворочается,потому что в нее засунули на порядок больше разрезов учета. Кроме того, она ворочается в целом шустрее семерки, поэтому на косяки кода народ забивает.
Ну, дохрена мест, где и запрос в цикле и вытаскивание реквизитов через точку, которые положили бы семерку ииии, к работе привлекли бы спеца, который, скорее всего, прямыми запросами привел ситуацию в божеский вид. Восьмерка это прощает и поэтому, хоть и работает медленно, но работает и никто не бьет в колокол.
42 МихаилМ
 
24.06.20
00:16
(36)
речь была в контескте проблемы (0) " увеличением объема обрабатываемых данных нелинейно увеличивается время обработки".
но с изменением с 1c 8.16 многие алгоритмы стали стали работать нелинейно от объема данных .

(38) понял.
43 Злопчинский
 
24.06.20
00:19
(41) то есть если я на клюшках еще задумывался для своих мелких клиентов чтобы ну хотя бы терпимо было по времени, то на восьмерке для этого типа клиентов - вообще пофиг будет на вытяжку запросами, тянуть по привычке через точку и выборками и зашибися...?
44 H A D G E H O G s
 
24.06.20
00:27
(43) В целом - да, но лучше не надо.
Как ни странно, мифы о тормознутости 8-ки преувеличены. Ты бы и сам смог в этом убедиться, если бы не ленился и попробовал в восьмерку.
90% тормозов в моей памяти - это косяки в данных, либо в программной настройке сервера, либо в аппаратном составе сервера, либо в доработках.
9% - это всякие хитрые штуки в типовой, например crossjoin план запроса, которые оперативно правятся 1С-кой.
Ну и где то 1% жалкий процент тормозов - это платформа.
45 Надо работать
 
24.06.20
06:44
(31) сделай заменить в цикле 100000 раз - разница будет а разы
46 spectre1978
 
24.06.20
06:45
(31) ну разница-то все же есть. Впрочем, речь не об этом. Речь о том что автор не написал сколько у него операций реплейса и на каких объемах. Если у него мегабайтные строки и операций десятки или сотни то в тормозах-то ничего странного может и нет. И тут надо думать куда уехать с больших строк.
47 spectre1978
 
24.06.20
06:49
Проблема стандартной работы со строками - там скорость сильно зависит от длины. Если использовать rope для хранения строки - там такой сильной зависимости нет. В принципе, на Дереве значений шнур можно сделать.
48 Garykom
 
гуру
24.06.20
07:03
(20) Еще предложи распараллелить обработку строк в кучу потоков.
Потоков 100 так берем и делим 300к строк на 3к в каждом потоке где СтрЗаменить
49 NorthWind
 
24.06.20
08:15
(48) Ну кстати тоже вариант. Только надо будет позаботиться, чтобы заменяемая строка не разбилась между чанками.
50 NorthWind
 
24.06.20
08:16
если образец на замену может быть произвольным и заранее неизвестно каким, тогда это может создать определенные сложности :)
51 Волшебник
 
модератор
24.06.20
08:23
Нужно понять прикладной смысл задачи. Что за файл, что меняем.
Похоже на какую-то корректировку журнала регистрации.
52 TormozIT
 
гуру
25.06.20
00:38
Где замер то?
53 Bigbro
 
25.06.20
07:13
чтобы ускорить работу в данном случае нужно от 300 000 до 1 500 000 вызовов СтрЗаменить заменить на меньшее количество.
то есть сначала объединить куски текста и потом заменить в результате а не менять в каждой подстроке с последующим объединением.
пробуйте.
54 Волшебник
 
модератор
25.06.20
07:16
(53)+ Это однозначно поможет. Кроме того, возможно, стоит организовать потоковую обработку файлов через ЧтениеТекста и ЗаписьТекста с быстрой обработкой буфера.
55 fisher
 
25.06.20
09:35
(0) > Столкнулся с тем, что при увеличении объёма данных сильно падает производительность.
Нелинейно, что ли?
56 fisher
 
25.06.20
09:36
Если нелинейно, то стопудово проблема в руках. Код в студию.
57 Eiffil123
 
25.06.20
14:05
(12) можно придумать какой-нибудь кэш - вызывать процедуру, которая сначала в кэше ищет сокращенный вариант, если не находит, тогда использовать СтрЗаменить. Не факт, что ускорит, нужно экспериментировать с реальными данными.

Я для загрузки из xml использовал похожий принцип, когда при загрузке по ключевым параметрам кэшировались ссылки на элементы БД в памяти, чтобы каждый раз за ними в БД не ходить.
58 GROOVY
 
25.06.20
14:08
Чувак похоже XML руками собирает :))))
59 sitex
 
naïve
25.06.20
14:56
(58) ага , По символьно)
60 Конструктор1С
 
25.06.20
15:06
(58) почти. JSON он руками собирает (15)
61 lodger
 
25.06.20
17:04
(60) даже это можно делать без таких затыков в производительности.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший