Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Ускорить СтрЗаменить

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.