powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Что быстрее: перебор строк рекордсета или элементов массива?
25 сообщений из 40, страница 1 из 2
Что быстрее: перебор строк рекордсета или элементов массива?
    #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
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518560
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мама миа... А запросом не проще ли?? Для чего в данном случае используется ф-ия InStr? Т.е. куды попадаит возвращаемое ей значение?
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518566
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ускорение будет, конечно.
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518574
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в массив вы как будете данные закачивать?
Через rs?
И где тут ускорение?

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

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

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

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

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

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

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

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

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

2 zz

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

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

2 paparome

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

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

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

Я тоже думал о такой замене. A что InStrB быстрее InStr?
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #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
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518665
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно отсоединенный рекрсет будет работать сравнимо со скоростью массива. (а может быстрее??)

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

100 - 255 символов. В 90% ~ 200 символов.
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518706
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще 2 вопроса. Какова примерная длина rstx("Name") и как максимально/в среднем часто может встечаться rstx("Name") в G?
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #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
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518721
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, всем пока. Пошел я домой. На выходных поломаю голову.
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518739
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz , на тебя вся надежда ;-). Счастливо отдохнуть!
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518741
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
щас сильно в мыле
а InStrB заметно быстрее InStr, если память не изменяет, %15-20
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518747
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
25 сообщений из 40, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Что быстрее: перебор строк рекордсета или элементов массива?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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