Гость
Форумы / [игнор отключен] [закрыт для гостей] / 1С 7.7 Разборка очень большой строки / 18 сообщений из 18, страница 1 из 1
19.02.2016, 11:44
    #39175101
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Доброго дня.

Сразу скажу, что я не спец по 1С и сильно не пинайте.
Столкнулся с такой проблемой.
Написал .dll для работы с сторонней БД.
Из БД получаю в переменную (допустим Строка) 1С большую строку с разделителями (можно любые)
10 000 подстрок почти мгновенно !
Когда дело доходит до разборки на подстрок - тормоза жуткие ...
Я понял, что все упирается в размер основной строки, чем больше - тем медленее
Как это побороть ?
Использую в 1С функцию:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Функция Поле(Стр, Разделитель, Позиция) Экспорт
     Если Позиция < 1 Тогда Возврат Стр; КонецЕсли; 
     Поз = 0; Значение = ""; 
     Если СтрЧислоВхождений(Стр, Разделитель) = 0 Тогда 
          Возврат Стр; 
     ИначеЕсли СтрЧислоВхождений(Стр, Разделитель) + 1 < Позиция Тогда 
          Возврат ""; 
     КонецЕсли; 
     Для ы = 1 По СтрДлина(Стр) Цикл 
          Значение = Значение + Сред(Стр, ы, 1); 
          Если Сред(Стр, ы, 1) = Разделитель Тогда 
               Поз = Поз + 1; 
               Если Поз = Число(Позиция) Тогда
                    Возврат Лев(Значение, СтрДлина(Значение)-1); 
               Иначе Значение = ""; 
               КонецЕсли; 
         КонецЕсли; 
     КонецЦикла; 
     Возврат Значение; 
КонецФункции



Спасибо.
...
Рейтинг: 0 / 0
19.02.2016, 11:51
    #39175119
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Valeriu,

Ну клюшки со строками работали весьма паршиво. Мы обходили это впихивая нужное в xml или dbf. С txt большого размера к сожалению тоже беда, хотя и не такая как в вашем варианте.
...
Рейтинг: 0 / 0
19.02.2016, 12:31
    #39175166
Bone serpent
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Valeriu,

Говнокод, он и в 7.7 говнокод.
Попробуйте примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Функция Поле(Стр, Разделитель, Позиция) Экспорт
     Перем времСтр, КолвоПодстрок;
     Если Позиция < 1 Тогда 
          Возврат Стр;
     Иначе
          времСтр = СтрЗаменить(Стр, Разделитель, РазделительСтрок);
          КолвоПодстрок = СтрКоличествоСтрок(времСтр);
          Если КолвоПодстрок = 1 Тогда
               Возврат Стр;
          ИначеЕсли  Позиция > КолвоПодстрок Тогда
               Возврат ""; 
          Иначе
               Возврат СтрПолучитьСтроку(времСтр, Позиция);
          КонецЕсли;
     КонецЕсли;
КонецФункции
...
Рейтинг: 0 / 0
19.02.2016, 12:50
    #39175186
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Bone serpent,
Спасибо.
Уже быстрее.
Попробую счс с массивом, но знаю что и здесь просвета не видать...
...
Рейтинг: 0 / 0
19.02.2016, 20:31
    #39175625
Bone serpent
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Valeriu,

Дальше можно вынести "тяжелую" операцию разбиения длинной строки на "слова" по разделителю за пределы цикла. Как я понимаю, строка длинная, разделителей много и функция Поле() вызывается много раз для одной и той же строки. И каждый раз происходит один и тот же СтрЗаменить().
Возможно выгоднее бы оказалось строку делить на "слова" один раз при чтении из базы. На многострочный текст. Или список значений. Тут уже тестировать надо, что выгоднее.
...
Рейтинг: 0 / 0
19.02.2016, 22:49
    #39175680
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Bone serpent,
мне кажется имеет большое значение как планируется эту строку потом использовать
...
Рейтинг: 0 / 0
22.02.2016, 12:35
    #39176666
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Bone serpent,
Дальше можно вынести "тяжелую" операцию разбиения длинной строки на "слова" по разделителю за пределы цикла

Так и сделал. Отдал эту функцию разбора .dll, сформировав одномерный массив.
Потом на стороне 1С перебираю . 10 000 строк пару секунд. Красота...

Спасибо.
...
Рейтинг: 0 / 0
24.02.2016, 13:41
    #39177667
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
ValeriuBone serpent,
Дальше можно вынести "тяжелую" операцию разбиения длинной строки на "слова" по разделителю за пределы цикла

Так и сделал. Отдал эту функцию разбора .dll, сформировав одномерный массив.
Потом на стороне 1С перебираю . 10 000 строк пару секунд. Красота...

Спасибо.Тоесть отдельная dll выполняет математику? А код обращения к dll можно посмотреть?
...
Рейтинг: 0 / 0
24.02.2016, 13:44
    #39177673
AHDP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Загрузка в список значений работает вполне сносно:
СписокЗнач.ИзСтрокиСРазделителями("1,2,3,""Аа"",""Бб""");
...
Рейтинг: 0 / 0
24.02.2016, 15:21
    #39177859
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Что интересно .
За пределами 1С в .dll (сделано на VB ) вывел и функцию разбора строки ...
Результат меня ошеломил !
Работает как пуля !
Вот мне и обьясните почему так ?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
' VB
Public Function Поле(chars As String, delimiter As String, position As Long)
Dim current As Long, length As Long
Dim count As Long
Dim back As String
    If position < 1 Then
        Поле = ""
        Exit Function
    End If
    ReDim Where(0 To position + 1) As Long
    Where(0) = 1
    current = 1
    length = Len(delimiter)
    For count = 1 To position
        Where(count) = InStr(current, chars, delimiter)
        If Where(count) = 0 Then Where(count) = Len(chars) + 1
        current = Where(count) + Len(delimiter)
    Next count
    If position = 1 Then
        length = 0
    End If
    If (Where(position) = Where(position - 1)) Then
        back = ""
    Else
        back = Mid(chars, (Where(position - 1) + length), (Where(position) - Where(position - 1) - length))
    End If
    Поле = back
End Function


Код: vbnet
1.
2.
3.
4.
// в 1C
Для cik=1 По m.ПолучитьРазмер1() Цикл
   Сообщить(m.Поле(m.ПолучитьПараметр1(),"|",cik)); 
КонецЦикла;


А все это загрузить в ТЗ + дополнительный разбор подстрок - секунда !
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 sc = 0;  
     Для i = 0 По m.ПолучитьРазмер1() Цикл 
	 sc = sc + 1;
	 ТЗТМП.НоваяСтрока(sc);
	 ret1 = (m.ПолучитьМассив1(i)); 
     ТЗТМП.УстановитьЗначение(sc,"Nr",m.Поле(ret1,"\",1)); 
     ТЗТМП.УстановитьЗначение(sc,"NrTab",m.Поле(ret1,"\",2)); 
	 ТЗТМП.УстановитьЗначение(sc,"FIO",m.Поле(ret1,"\",3));
     ТЗТМП.УстановитьЗначение(sc,"CodFisc",m.Поле(ret1,"\",4)); 
     ТЗТМП.УстановитьЗначение(sc,"AnNs",m.Поле(ret1,"\",5)); 
     ТЗТМП.УстановитьЗначение(sc,"Sex",m.Поле(ret1,"\",6));
     ТЗТМП.УстановитьЗначение(sc,"Adresa",m.Поле(ret1,"\",7)); 
     ТЗТМП.УстановитьЗначение(sc,"CPAS",m.Поле(ret1,"\",10));
	 ТЗТМП.УстановитьЗначение(sc,"Ceh",m.Поле(ret1,"\",11));
	 КонецЦикла; 
     ТЗТМП.Выгрузить(ТЗ); //ТЗ-называние таблицы(см. свойства)

...
Рейтинг: 0 / 0
24.02.2016, 15:50
    #39177896
Последний выдох ГПЖ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
неявная типизация + тормозной интерпритатор
...
Рейтинг: 0 / 0
24.02.2016, 17:30
    #39178004
Bone serpent
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Valeriu,

Причин множество. Одна из них описана в http://infostart.ru/public/14299/
...
Рейтинг: 0 / 0
02.03.2016, 09:52
    #39183293
Gena Letchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
в VB есть функция Split(строка, разделитель) = массив из строк
Join(Массив, разделитель) = строка

Зачем изобретать велосипед. Массивы самые быстрые и в vb и 1с
Есть аналог Split в 1с - РазбитьСтрокуНаМассивПодтрок - как-то так.
...
Рейтинг: 0 / 0
02.03.2016, 10:44
    #39183346
Gena Letchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Есть разница в передаче параметров в функции/процедуры
В VB по-умолчанию ByVal( по значению - это как Знач 1с), а в 1с по-умолчанию ByRef(по ссылке)
попробуйте:
Функция Поле(Знач Стр = "", Знач Разделитель = " ", Знач Позиция = 0) Экспорт
...
Рейтинг: 0 / 0
02.03.2016, 11:38
    #39183468
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Gena Letchik,
Попробуйте разобрать СТРОКУ 6 Мгб средствами 1с 7.7
Примерно 100 000 подстрок с разделителями "|"
плюс разобрать подстроку - еще 10 полей с разделителем "\"
И смотрите сколько это времени будет.
...
Рейтинг: 0 / 0
02.03.2016, 11:52
    #39183500
Gena Letchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Valeriu,
на VB это можно сделать проще, имхо
Код: vbnet
1.
2.
3.
4.
5.
i = Split(Строка6МБ, " ")
For n=0 to UBound(i)
	c = Split(i(n), "\")

Next n
...
Рейтинг: 0 / 0
02.03.2016, 12:04
    #39183515
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Gena Letchik,
Так разговор об этом шел с самого начало ... за пределами 1С
Я ниже писал.
...
Рейтинг: 0 / 0
02.03.2016, 12:47
    #39183596
Gena Letchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С 7.7 Разборка очень большой строки
Valeriu,

ну )) так я вам и говорю, что можно еще ускорить VB-код и упростить, а так же и попробовать ускорить 1с передавая значение а не ссылку и определять тип параметра значением по-умолчанию. Насчет 7,7 не знаю, в общем, может сработать.
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / 1С 7.7 Разборка очень большой строки / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]