powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Что быстрее: перебор строк рекордсета или элементов массива?
15 сообщений из 40, страница 2 из 2
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518748
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha

Это уже кое-что! Так понял, если буду пользовать InStrB, то и длины должен буду считать через LenB?

W = LenB(G)
Y = N + LenB(rsx("Name"))

Раньше InStrB не использовал ...
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518754
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexus112
Ты еще жив?
Это что за зверь?
Do While Y < W

что тут пытается происходить?
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518760
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, протестите плиз запросы мои на 1-ой странице... А то уже домой бежать надо, хочется результат узнать...
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518769
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 zz

Спасибо, попробую в понедельник. Но что-то сомнения у меня насчет увеличения скорости ... Мне ж еще все координаты найденных надо в массив A8() затолкнуть ...
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518773
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Алекс: опять же: а зачем эти координаты тебе в массиве? Какова конечная цель?
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518781
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha

Это проверка просмотрена ли вся строка G:

Y - это позиция в G с которой смотрим
W - это длина G

Т.е. есть при невыполнении это условия строку просмотрели и выходим из цикла.

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

Нужны они мне :) как шпиону секретная информация:

Массив A8() использую далее в аналогичном цикле по той же строке G, но ищется в ней другой набор вхождений. А потом сравниваются найденные координаты, с координатами из A8().
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32518836
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexus112

вот попробуй для начала, и скажи быстрее или нет исходного варианта

Код: 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.
Dim rsx As DAO.Recordset
               Dim myField As DAO.Field, myID As DAO.Field
               
               Dim N As Long
               
               '...
               i = 0
               Dim sName As String
               
                If Not rsx.EOF Then  'rsx.RecordCount >  0  Then
                 Set myField = rsx("Name")
                 Set myID = rsx("BN_id")
                 
                    rsx.MoveFirst '??? 'Все Exclusions по текущей Task
                    Do While rsx.EOF = False
                        Y =  1  'Поиск начинаем с первого символа строки G
                        N = 0
                        sName = Nz(myField.Value, vbNullString)
                        Do ' While Y < W 'Просматриваем всю строку поля на текущий Exclusion до конца
                            N = InStrB(Y, G, rsx("Name"))
                            If N > 0 Then 'Нашли Exclusion
                              '  N = (N \ 2) + (N Mod 2) - это если не хочешь в байтах считать
                                A8(i, 0) = N 'Координата начала Exclusion
                                A8(i,  1 ) = N + LenB(sName) 'Len(rsx("Name")) - 1   'Координата конца Exclusion
                                A8(i,  2 ) = myID.Value 'rsx("BN_id") 'Код брэнда
                                Y = N + LenB(sName) 'Len(rsx("Name"))
                                i = i + 1
                            Else
                                Exit Do 'Выходим из этого цикла, т.к. этот Exclusion не нашли вообще
                            End If
                        Loop While N >  0 
                        rsx.MoveNext
                    Loop
                    X = X + i 'Количество найденных Exclusions
                End If
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32519328
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что - то автора не видно - спит, наверно.
корявенько у мене получилось сходу, циклик лучшее так переписать:

Код: 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.
               Dim rsx As DAO.Recordset
               Dim myField As DAO.Field, myID As DAO.Field
               
               Dim N As Long
               
               '...'
               i =  0 
               Dim sName As String
               
                If Not rsx.EOF Then  
                 Set myField = rsx("Name")
                 Set myID = rsx("BN_id")
                 
                    rsx.MoveFirst '??? 'Все Exclusions по текущей Task
                    Do While rsx.EOF = False
                        Y =  1  'Поиск начинаем с первого символа строки G'
                        N =  0 
                        sName = Nz(myField.Value, vbNullString)
                        N = InStrB(Y, G, rsx("Name"))

                        Do While N >  0  
                              '  N = (N \ 2) + (N Mod 2) - это если не хочешь в байтах считать '              
                                A8(i,  0 ) = N 'Координата начала Exclusion'
                                A8(i,  1 ) = N + LenB(sName) 'Len(rsx("Name")) -   'Координата конца Exclusion''
                                A8(i,  2 ) = myID.Value 'rsx("BN_id") Код брэнда'
                                Y = N + LenB(sName) 'Len(rsx("Name"))'
                                i = i +  1 
                                X = X + i 'Количество найденных Exclusions'
                                N = InStrB(Y, G, rsx("Name"))                            
                        Loop      
                        rsx.MoveNext
                    Loop
                  
                End If
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32519331
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в предыдущем посте опять опШиПка - в N = InStrB(Y, G, rsx("Name")) вместо rsx("Name") д.б. sName (((ж

Если ОЧЕНЬ хочется позаморачиваться с масивами, то вариант0 мог бы выглядеть приблизительно так (реальное быстродействие зависит в первую очередь от типа рекордсета. Собственно обработку массива можно поулучшать, но сейчас не могу вывалить реально хорошего варианта под акцесс) :

Код: 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.
40.
41.
42.
Dim lflDNameID as Long, lflDBNID as Long
  Dim aVars as Variant 'эта переменная будет массивом, в который читаем данные из рекордсета'
  
  Dim zRows as long 'счетчик фактически прочитанных строк таблицы'
  Dim iNdex as Long 'будет счетчиком цикла'
  Dim rsx As DAO.Recordset
               
  Dim N As Long
               
  '...'
  i =  0 
  Dim sName As String
   
  If Not rsx.EOF Then  
    lflDNameID=rsx.Fields("Name").CollectionIndex
    lflDBNID = rsx.Fields("BN_id").CollectionIndex 
    
    Do Until rsx.EOF
      aVars = rsx.GetRows( 300 ) ' читаем по 300 записей'
      zRows = UBound(aVars,  2 ) ' смотрим, сколько прочитали на самом деле'
      
      For iNdex =  0  TO zRows 'Цикл по прочитанным строкам рекордсета'
        Y =  1  'Поиск начинаем с первого символа строки G'
        N =  0 
        sName = Nz(aVars(lflDNameID,iNdex), vbNullString)

        N = InStrB(Y, G, sName)
        
        Do While N >  0  
        
          A8(i,  0 ) = N 'Координата начала Exclusion'
          A8(i,  1 ) = N + LenB(sName) 'Len(rsx("Name")) -   'Координата конца Exclusion''
          A8(i,  2 ) = aVars(lflDBNID,iNdex)  ' Код брэнда'
          Y = N + LenB(sName) 
          i = i +  1 
          X = X + i 'Количество найденных Exclusions'
          N = InStrB(Y, G, sName)                            
        Loop     

      Next iNdex
    Loop 

  End if 
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32519769
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alex:
Опять же, почему это нельзя сделать запросом? А насчет "сравнить" - так это однозначно лучше запросом делать, чем циклом по массиву!
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32519818
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 zz
не знаю почему, но как-то неочевидны для меня Ваши утверждения про однозначность.
Мы с Вами, сударь, в этом месте составляем бабушку на двоих. Вот пусть Alex112 и проверит
-))
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32519825
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha:
Не, может, я ошибаюсь, конечно, черт его знает...
Привык просто уходить везде, где можно, от циклов по рекордсетам. Не нравятся они мне. Вызывают, тасказать, унутреннее отторжение :))

Не спорю, возможно, в данном случае действительно лучше циклом. Но почему бы не предложить альтернативный вариант? (а заодно и свои силы проверить - получится или нет).

Кстати, задача Алекса имеет еще одно решение, не зависящие от кол-ва вхождений поля Name в строку G, как мой первый вариант.
1. Строка G разбивается через Mid на все возможные куски и пишутся эти куски в таблицу с указанием начала/конца вхождения. Время в случае Len(G)=220 3 сек.
2. INNER JOIN нашего рекордсета с полученной таблицей по текстовому полю даст нужный итог. Время в случае Count(*)=10000 ок. 1 секунды.
Итого 4 сек.
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32519837
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 zz
OK

красиво.
...
Рейтинг: 0 / 0
Что быстрее: перебор строк рекордсета или элементов массива?
    #32519942
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, у меня небольшая запарка на работе. К концу дня постараюсь проверить. Спасибо!
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Что быстрее: перебор строк рекордсета или элементов массива?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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