Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Что быстрее: перебор строк рекордсета или элементов массива? / 25 сообщений из 40, страница 1 из 2
14.05.2004, 16:14
    #32518547
Alex112
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
Задачка следующая.

Сейчас открываю рекордсет rs с 1000 записей и тремя полями. Затем в цикле перебираю все записи:

Код: plaintext
1.
2.
3.
4.
5.
6.
Do While rs.EOF = False
   '******
   InStr(1, НекаяСтрока, rs("Text")) 
   '******
   rs.MoveNext
Loop

Т.к. этот цикл запускается в другом цикле (rs открыт постоянно: перед запуском вложенного цикла делаю rs.MoveFirst), на большом количестве записей в rs прога начинает подтормаживать.

Вопрос. А если заменить rs трехмерным массивом, будет ли хотя бы какое-то ускорение работы? Работаю в A97.
...
Рейтинг: 0 / 0
14.05.2004, 16:18
    #32518560
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
мама миа... А запросом не проще ли?? Для чего в данном случае используется ф-ия InStr? Т.е. куды попадаит возвращаемое ей значение?
...
Рейтинг: 0 / 0
14.05.2004, 16:19
    #32518566
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
Ускорение будет, конечно.
...
Рейтинг: 0 / 0
14.05.2004, 16:22
    #32518574
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
А в массив вы как будете данные закачивать?
Через rs?
И где тут ускорение?

Я так понял, что у вас 3 цикла (по каждому из полей)?
Итого 1000^3
Массив у Вас тоже в даун уйдет при миллиарде итераций - надо что-то в алгоритме менять - или смириться

И массив вам судя по всему не 3-х мерный нужен, а 3 одномерных?
Если да - то массивы быстрее должны работать.
...
Рейтинг: 0 / 0
14.05.2004, 16:22
    #32518577
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
теперь я вообще ничего не понимаю. Как можно Рекордсет (столбцы, строки) заменить ТРЕХмерным массивом (кубиком)
???
...
Рейтинг: 0 / 0
14.05.2004, 16:25
    #32518585
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 zz

автортеперь я вообще ничего не понимаю. Как можно Рекордсет (столбцы, строки) заменить ТРЕХмерным массивом (кубиком)
???

Насколько я понимаю - примерно так :)
Код: plaintext
1.
Select a.f1, b.f2, c.f3
From tbl a, tbl b, tbl c
...
Рейтинг: 0 / 0
14.05.2004, 16:27
    #32518589
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 paparome:

Ускорение будет за счет того, что сейчас проход по рекордсету делается внутри цикла, а для загрузки достаточно однократного прохода.
...
Рейтинг: 0 / 0
14.05.2004, 16:28
    #32518591
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
у рекордсета есть GetRows, возвращает ДВУМЕРНЫЙ массив.

В среднем это будет быстрее, но сильно зависит от типа рекордсета. Кажется, самый быстрый вариант будет, если рекордсет ФорвардОнли. Есть еще детали в зависимости от того, чей он - DAO или ADO.
...
Рейтинг: 0 / 0
14.05.2004, 16:28
    #32518594
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 paparome:
Ну и хде тута трехмерность? Типа, третья ос? Не-е-е...

И вообще, чем обсуждать, что быстрее - массив или рекордсет, надо попросить человека привести полный код. Чует мое сердце, его задача решается двумя UPDATE и одним SELECT :))
...
Рейтинг: 0 / 0
14.05.2004, 16:32
    #32518601
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
замечание
при 3000 сравнений есть смысл подумать о замене Instr на InStrB, тем больший, чем длиннее сравниваемые пары.
...
Рейтинг: 0 / 0
14.05.2004, 16:33
    #32518605
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 Саныч

Я ж не против :)
...
Рейтинг: 0 / 0
14.05.2004, 16:41
    #32518628
Alex112
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 Владимир Саныч

А есть ли опыт? Меня интересует стоит ли овчинка выделки. Хотя бы ориентировочная экономия времени, при прочих равных условиях.

2 zz

Запросом нельзя. Я просто упростил выражение в скобках InStr().

Трех мерный массив это не куб. Имел ввиду массив вида Arr(1000,2), где 2 и дает "три измерения" (или 2 строки), куда можно затолкать весь rs.

2 paparome

Цикла 2, как написал: во внешнем цикле rs и результаты InStr никак не используются.

rs открывается ОДИН раз при запуске базы. Если его данными заполню массив, то это время мне не критично.
...
Рейтинг: 0 / 0
14.05.2004, 16:44
    #32518633
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 Alex:
Ну все-таки, если не трудно, приведи кусок кода, где ты работаешь с рекордсетом. Может, и действительно нельзя запросом. Но я скотина недоверчивая, хочу сам проверить.
...
Рейтинг: 0 / 0
14.05.2004, 16:47
    #32518636
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
авторТрех мерный массив это не куб.
Трехмерный массив - это куб (с фактами не поспоришь :))

А у Вас двухмерный массив, точнее - даже два одномерных :)
...
Рейтинг: 0 / 0
14.05.2004, 16:48
    #32518639
Alex112
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 Victosha

Я тоже думал о такой замене. A что InStrB быстрее InStr?
...
Рейтинг: 0 / 0
14.05.2004, 16:55
    #32518655
Alex112
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 zz

Вот небольшой кусочек. Хочу выжать из VBA максимум возможного. Повторяю, это Access 97, т.е. DAO.rs.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
                I =  0 
                If rsx.RecordCount >  0  Then
                    rsx.MoveFirst 'Все Exclusions по текущей Task
                    Do While rsx.EOF = False
                        Y = 1 'Поиск начинаем с первого символа строки G
                        Do While Y < W 'Просматриваем всю строку поля на текущий Exclusion до конца
                            N = InStr(Y, G, rsx("Name"))
                            If N > 0 Then 'Нашли Exclusion
                                A8(I,  0 ) = N 'Координата начала Exclusion
                                A8(I, 1) = N + Len(rsx("Name")) - 1   'Координата конца Exclusion
                                A8(I,  2 ) = rsx("BN_id") 'Код брэнда
                                Y = N + Len(rsx("Name"))
                                I = I + 1
                            Else
                                Exit Do 'Выходим из этого цикла, т.к. этот Exclusion не нашли вообще
                            End If
                        Loop
                        rsx.MoveNext
                    Loop
                    X = X + I 'Количество найденных Exclusions
                End If
...
Рейтинг: 0 / 0
14.05.2004, 16:58
    #32518665
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
возможно отсоединенный рекрсет будет работать сравнимо со скоростью массива. (а может быстрее??)

если не сложно сравни и сообщи результаты самому интересно...
...
Рейтинг: 0 / 0
14.05.2004, 17:12
    #32518689
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
Какова примерная длина строки G?
...
Рейтинг: 0 / 0
14.05.2004, 17:16
    #32518695
Alex112
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 zz

100 - 255 символов. В 90% ~ 200 символов.
...
Рейтинг: 0 / 0
14.05.2004, 17:24
    #32518706
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
еще 2 вопроса. Какова примерная длина rstx("Name") и как максимально/в среднем часто может встечаться rstx("Name") в G?
...
Рейтинг: 0 / 0
14.05.2004, 17:31
    #32518719
Alex112
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
2 zz

Длина rsx("Name") ~ 2 - 20 символов. В 90% ~ 3 - 10 символов.

Число вождений одного значения rsx("Name") в G ~ 0 - 6.

Число вождений всех значении rsx("Name") в одну строку G ~ 0 - 10. В 90% ~ 1 - 3.

В приведенном куске кода, W = Len(G).
...
Рейтинг: 0 / 0
14.05.2004, 17:32
    #32518721
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
Ладно, всем пока. Пошел я домой. На выходных поломаю голову.
...
Рейтинг: 0 / 0
14.05.2004, 17:37
    #32518739
Alex112
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
zz , на тебя вся надежда ;-). Счастливо отдохнуть!
...
Рейтинг: 0 / 0
14.05.2004, 17:38
    #32518741
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
щас сильно в мыле
а InStrB заметно быстрее InStr, если память не изменяет, %15-20
...
Рейтинг: 0 / 0
14.05.2004, 17:46
    #32518747
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее: перебор строк рекордсета или элементов массива?
Все-таки я ее решил. Алекс, проверь.
Итак два запроса. 1-ый запрос:



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
PARAMETERS MyStr Text (  255  );
SELECT d.id, d.field, InStr( 1 ,[MyStr],[field]) AS fs1, Len([field])+[fs1] AS ff1, 
InStr([ff1],[MyStr],[field]) AS fs2, Len([field])+[fs2] AS ff2,
 InStr([ff2],[MyStr],[field]) AS fs3, Len([field])+[fs3] AS ff3,
 InStr([ff3],[MyStr],[field]) AS fs4, Len([field])+[fs4] AS ff4,
 InStr([ff4],[MyStr],[field]) AS fs5, Len([field])+[fs5] AS ff5,
 InStr([ff5],[MyStr],[field]) AS fs6, Len([field])+[fs2] AS ff6
FROM d;

зовется он strBase.

2-ой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select id, field, fs1, ff1
from (
SELECT id, field,fs1,ff1
FROM strBase
union
SELECT id, field,fs2,ff2
FROM strBase
union
SELECT id, field,fs3,ff3
FROM strBase
union
SELECT id, field,fs4,ff4
FROM strBase
union
SELECT id, field,fs5,ff5
FROM strBase
union
SELECT id, field,fs6,ff6
FROM strBase)
where fs1<> 0 

Как видно, все основано на том, что поле "Name" не будет входить более 6 раз в строку G.
Alex, за тобой тестирование :))
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Что быстрее: перебор строк рекордсета или элементов массива? / 25 сообщений из 40, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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