Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Работа со строками (поиск/замена) / 16 сообщений из 16, страница 1 из 1
31.01.2005, 14:44
    #32892547
Сотников
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
PowerBuilder 9.0.2
Проблема в следующем:

Есть некоторые шаблоны, типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
.....................
<!-- START var_1 -->
.....................
<!-- END var_1 -->
.....................
<!-- START var_2 -->
.....................
<!-- END var_2 -->
.....................
и так далее...
где
Код: plaintext
1.
2.
<!-- START var_1 -->
.....................
<!-- END var_1 -->
некоторые блоки причем "var_1" - это название блока и оно может быть различным.

Нужно заменить содержимое блоков на некоторые строковые данные.

Я написал функцию, которая делает:
1) Ищет наименования блоков
2) Для каждого найденного наименования блока находит его содержимое (то есть между START и END)
3) Имея содержимое блока заменяет его на нужные строковые данные.

Все работает, НО, когда количество блоков становится значительным... где то более 500, то функция значительно начинает подтормаживать расходуя для вычисления процессор (с памятью там все OK, так как делается через reference).


Не подскажет ли мне всемирный разум что нибудь на тему работы с текстовыми данными в направлении поиска/замены, для оптимизации моего алгоритма.
...
Рейтинг: 0 / 0
31.01.2005, 15:35
    #32892708
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Извини, не удержался. Такое я пропустить мимо не мог:
1. Написание Parser -ов на PowerBuilder есть полнейшая глупость. Не веришь мне? Спроси у ASCRUS , он писал парсер в свое время...
Нужно понимать, что есть PowerBuilder и не пытаться делать на нем то, для чего он не предназначен.
2. Когда мы начинали делать модуль для работы с XML форматом ЦБ рейсов, один шибко умный чудило, тоже предложил написать свой парсер для разбора текста. Каким то чудом, удалось этого избежать. И я нисколько об этом не жалею...
3. Я бы настоятельно советовал избавиться от этой идеи или реализовать Parser на другом языке программирования.
...
Рейтинг: 0 / 0
31.01.2005, 15:49
    #32892741
Сотников
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Black SavageИзвини, не удержался. Такое я пропустить мимо не мог:
1. Написание Parser -ов на PowerBuilder есть полнейшая глупость. Не веришь мне? Спроси у ASCRUS , он писал парсер в свое время...
Нужно понимать, что есть PowerBuilder и не пытаться делать на нем то, для чего он не предназначен.
2. Когда мы начинали делать модуль для работы с XML форматом ЦБ рейсов, один шибко умный чудило, тоже предложил написать свой парсер для разбора текста. Каким то чудом, удалось этого избежать. И я нисколько об этом не жалею...
3. Я бы настоятельно советовал избавиться от этой идеи или реализовать Parser на другом языке программирования.

Реализовать такой Parser на другом языке в данном конкретном случае не представляется возможным, но вы натолкнули меня на мысль... в сторону XML... кстати по поводу этого вопрос: c XML работать через PBDOM?
...
Рейтинг: 0 / 0
31.01.2005, 16:00
    #32892765
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Сотниковкстати по поводу этого вопрос: c XML работать через PBDOM?

Да. А, что не плохая идея. Прописать все ваши шаблоны, как XML документы. Тогда доступ к данным будет стандартизированный, другие ваши (не ваши) проги смогут цеплять/изменять данные без труда. Наверное, стоит об этом подумать...
...
Рейтинг: 0 / 0
31.01.2005, 16:16
    #32892814
Сотников
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Об этом я и подумал... !!!
...
Рейтинг: 0 / 0
31.01.2005, 16:21
    #32892836
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
СотниковНе подскажет ли мне всемирный разум что нибудь на тему работы с текстовыми данными в направлении поиска/замены, для оптимизации моего алгоритма.

Покажите код функции.
Если используете string, попробуйте предварительно резервировать память вызовом типа space(n) или fill(chars,n). На постоянных realloc'ах при больших строках билдер будет "проседать".
...
Рейтинг: 0 / 0
31.01.2005, 17:10
    #32893000
Сотников
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Локшин Марк
Покажите код функции.


Я думаю не многим нужно в нём разбираться. Но всё же...

Локшин Марк
Если используете string, попробуйте предварительно резервировать память вызовом типа space(n) или fill(chars,n). На постоянных realloc'ах при больших строках билдер будет "проседать".


На самом деле стринги не очень большие, не превышают 300Кб. Поэтому заполнение думаю не очень поможет.


Код: plaintext
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
global type gf_get_blocks from function_object
end type

forward prototypes
global function long gf_get_blocks (string l_block_format, string l_block_bound_start, string l_block_bound_end, ref string l_text, ref string l_blocks[])
end prototypes

global function long gf_get_blocks (string l_block_format, string l_block_bound_start, string l_block_bound_end, ref string l_text, ref string l_blocks[]);string s_block_start, s_block_end, arrnull[]
long l_block_find_start, l_block_find_end, l_find_start, i

l_blocks = arrnull

IF NOT (len(l_text) >  0 ) THEN
	return  0 
END IF

IF NOT (len(l_block_format) >  0 ) THEN
	s_block_start = l_block_bound_start
	s_block_end = l_block_bound_end
ELSE
	s_block_start = Left( l_block_format, Pos( l_block_format, l_block_bound_start ) )
	s_block_end = Right( l_block_format, len( l_block_format ) - LastPos( l_block_format, l_block_bound_end ) + Len( l_block_bound_end ) )
END IF

i =  1 
l_find_start =  1 
DO
	l_block_find_start = Pos( l_text, s_block_start, l_find_start ) + Len( s_block_start )
	IF l_block_find_start > len(s_block_start) THEN
		l_block_find_end = Pos( l_text, s_block_end, l_block_find_start ) - l_block_find_start 
		l_blocks[i] = Mid( l_text, l_block_find_start, l_block_find_end )
		i++
	ELSE
		EXIT
	END IF
	l_find_start = l_block_find_start + Len( l_blocks[i -  1 ] ) + Len( s_block_end )
LOOP WHILE ( l_block_find_start > len( s_block_start ) )

return Upperbound( l_blocks )
end function

затем по тексту каждого блока проходит замена:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
global type gf_replace_global from function_object
end type

forward prototypes
global subroutine gf_replace_global (ref string l_text, string l_str_old, string l_str_new)
end prototypes

global subroutine gf_replace_global (ref string l_text, string l_str_old, string l_str_new);long start_pos =  1 

start_pos = Pos( l_text, l_str_old, start_pos )
DO WHILE start_pos >  0 
    l_text = Replace( l_text, start_pos, Len( l_str_old ), l_str_new )
    start_pos = Pos( l_text, l_str_old, start_pos + Len( l_str_new ) )
LOOP

end subroutine
...
Рейтинг: 0 / 0
31.01.2005, 17:28
    #32893078
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Сотников На самом деле стринги не очень большие, не превышают 300Кб Поэтому заполнение думаю не очень поможет.
В некоторых случаях скорость возрастет раз в 10-20, не больше...
Ну и знчения
Код: plaintext
len(l_str_old)
и
Код: plaintext
len(l_str_new)
вычислять до цикла.
Можно еще попробовать не replace'ом пользоваться, а отдельно в новую строку копировать, хотя вот это скорее всего не будет быстрее.
...
Рейтинг: 0 / 0
31.01.2005, 18:09
    #32893212
Сотников
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Локшин Марк Сотников На самом деле стринги не очень большие, не превышают 300Кб Поэтому заполнение думаю не очень поможет.
В некоторых случаях скорость возрастет раз в 10-20, не больше...
Ну и знчения
Код: plaintext
len(l_str_old)
и
Код: plaintext
len(l_str_new)
вычислять до цикла.


Да... действительно... исправлю... спасибо

Я все таки решил пересмотреть способ реализации и направиться к XML
...
Рейтинг: 0 / 0
31.01.2005, 18:54
    #32893307
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
СотниковЯ все таки решил пересмотреть способ реализации и направиться к XML

Думаю, с точки зрения perfromance, это не спасёт отца русской демократии, то бишь тормозить будет точно так же.
Или пиши DLLку на С, или PBNI компонент...
...
Рейтинг: 0 / 0
31.01.2005, 21:23
    #32893440
zuzu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
global subroutine gf_replace_global (ref string l_text, string l_str_old, string l_str_new)

также лутше передавать параметры по референс или ридонли,
а вообсще у нас реализованно все в виде длл на с++
...
Рейтинг: 0 / 0
01.02.2005, 12:24
    #32894282
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Black Savage1. Написание Parser -ов на PowerBuilder есть полнейшая глупость. Не веришь мне? Спроси у ASCRUS, он писал парсер в свое время...
Кстати, в этом случае основное время (подозреваю, гораздо более 90%) тратится на исполнение функций pos и replace, код которых и так написан на C и не интерпретируется. В этом случае нужно оптимизировать уже сами алгоритмы поиска, используя что-нибудь вроде алгоритма Кнута-Морриса-Пратта или Бойера-Мура , поскольку производится поиск по названиям шаблонов, то дополнительные структуры для них можно рассчитывать предварительно. Я думаю, раз в 10 ускорить можно. Кстати, если пользоваться replace'ом, то вставляя в середину содержимое шаблона, вы все время таскаете оставшийся справа кусок текста, а 500 раз скопировать 150 КБ текста, все-таки не так быстро. Так что сбор в новую строку, я все-таки думаю, тоже ускорит процесс.
Да, а использование XML - это хорошо, но только если это действительно необходимо.
...
Рейтинг: 0 / 0
06.02.2005, 23:28
    #32903228
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Кстати, если необходимо разбирать какие-то огромные(по кол-ву объектов) объемы данных, то из ПБ самое то делать с внешними dll. В свое время пришлось делать с применением ПБ приложение по расчету матриц(решение задачи о "коммивояжере"). Матрицы хранились в БД. Размер матрицы 10000х10000, итого размер 400Мб. Так вот расскажу о реализации:
Код на ПБ - работал больше суток
Код на С подключенный через ДЛЛ - 15 минут
Код на АСМе встроенном в С подключенный через ДЛЛ - 2 мин
Ясен пень, что алгоритм во всех случаях одинаков... Делайте выводы.
...
Рейтинг: 0 / 0
07.02.2005, 10:51
    #32903549
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
iLLerКод на ПБ - работал больше суток
Код на С подключенный через ДЛЛ - 15 минут
Код на АСМе встроенном в С подключенный через ДЛЛ - 2 мин
Ясен пень, что алгоритм во всех случаях одинаков... Делайте выводы.
Ну так никто и не говорил, что эхотаг хорош в качестве числомолотилки .
...
Рейтинг: 0 / 0
07.02.2005, 17:05
    #32904536
Сотников
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
iLLerКстати, если необходимо разбирать какие-то огромные(по кол-ву объектов) объемы данных, то из ПБ самое то делать с внешними dll. В свое время пришлось делать с применением ПБ приложение по расчету матриц(решение задачи о "коммивояжере"). Матрицы хранились в БД. Размер матрицы 10000х10000, итого размер 400Мб. Так вот расскажу о реализации:
Код на ПБ - работал больше суток
Код на С подключенный через ДЛЛ - 15 минут
Код на АСМе встроенном в С подключенный через ДЛЛ - 2 мин
Ясен пень, что алгоритм во всех случаях одинаков... Делайте выводы.

А вот где найти dll "Код на С подключенный через ДЛЛ" или "Код на АСМе встроенном в С подключенный через ДЛЛ" для простого замены одного текстового фрагмента на другой?
...
Рейтинг: 0 / 0
07.02.2005, 20:11
    #32904872
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строками (поиск/замена)
Ну уж это и написать можно. Берете сначала Дельфи или Сибилдер и ваяете на нем прогу с необходимым алгоритмом. Потом выделяете это в функции и делаете ДЛЛ. Ничего сложного...)))
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Работа со строками (поиск/замена) / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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