Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск в массивах на 1млн строк - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск в массивах на 1млн строк (Макросы/Sub)
Поиск в массивах на 1млн строк
Cere6ellum Дата: Понедельник, 11.11.2019, 10:32 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Всем доброго дня.
Ищу решение проблемы.

Имеются 3 двумерных массива и 1 одномерный массив данных.
Двумерные состоят из примерно 1 млн строк.
Одномерный - пуст, но в него добавляются данные автоматически из двумерных.
Суть в другом.

Алгоритм такой.

Прогон по всем строкам основного двумерного массива.
Если значение этого массива, в текущей итерации, найдено в двух других массивах, - добавить это значение в одномерный массив.


Код оптимизировал для показа.
Время выполнения - страшно представить.
Какое можно найти решение в этой ситуации?
Чтобы производительность оптимизировать.

Коллекции и словари смотрел, но так и непонял как заполнить их многомерно.
Да и не факт, что будут работать быстрее массивов.

Вобщем, прошу помощи коллеги, в поиске изящного решения.
Может быть кто-то уже сталкивался с подобным.

[vba]
Код

Function findIn2DimArr(data, arrName, arrField, arrUBound)
    Dim i As Long

    findIn2DimArr = False

    'Data getting
    For i = 0 To CLng(arrUBound)

        If arrName(i, arrField) = data Then
        
            findIn2DimArr = True
            Exit Function
            
        End If
        
    Next i

End Function

Sub Test()

    ReDim myArr(1000000, 4)
    ReDim firstSomeArr(1000000, 4)
    ReDim secondSomeArr(1000000, 4)
    
    ReDim oneDimensionalArr(1000000)

    For i = 0 To arrUBound
    
        'If base wasn't added earlier - add to
        If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True And findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
        
            'Add to one-dimensional array
            
            
        End If
            
    Next i

End Sub
[/vba]


Сообщение отредактировал Cere6ellum - Понедельник, 11.11.2019, 10:33
 
Ответить
СообщениеВсем доброго дня.
Ищу решение проблемы.

Имеются 3 двумерных массива и 1 одномерный массив данных.
Двумерные состоят из примерно 1 млн строк.
Одномерный - пуст, но в него добавляются данные автоматически из двумерных.
Суть в другом.

Алгоритм такой.

Прогон по всем строкам основного двумерного массива.
Если значение этого массива, в текущей итерации, найдено в двух других массивах, - добавить это значение в одномерный массив.


Код оптимизировал для показа.
Время выполнения - страшно представить.
Какое можно найти решение в этой ситуации?
Чтобы производительность оптимизировать.

Коллекции и словари смотрел, но так и непонял как заполнить их многомерно.
Да и не факт, что будут работать быстрее массивов.

Вобщем, прошу помощи коллеги, в поиске изящного решения.
Может быть кто-то уже сталкивался с подобным.

[vba]
Код

Function findIn2DimArr(data, arrName, arrField, arrUBound)
    Dim i As Long

    findIn2DimArr = False

    'Data getting
    For i = 0 To CLng(arrUBound)

        If arrName(i, arrField) = data Then
        
            findIn2DimArr = True
            Exit Function
            
        End If
        
    Next i

End Function

Sub Test()

    ReDim myArr(1000000, 4)
    ReDim firstSomeArr(1000000, 4)
    ReDim secondSomeArr(1000000, 4)
    
    ReDim oneDimensionalArr(1000000)

    For i = 0 To arrUBound
    
        'If base wasn't added earlier - add to
        If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True And findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
        
            'Add to one-dimensional array
            
            
        End If
            
    Next i

End Sub
[/vba]

Автор - Cere6ellum
Дата добавления - 11.11.2019 в 10:32
skais Дата: Понедельник, 11.11.2019, 10:46 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 191
Репутация: 25 ±
Замечаний: 60% ±

Excel 2010
Cere6ellum Получается мы хотим получить значения, которые есть во всех трех массивах одновременно. Это так?
 
Ответить
СообщениеCere6ellum Получается мы хотим получить значения, которые есть во всех трех массивах одновременно. Это так?

Автор - skais
Дата добавления - 11.11.2019 в 10:46
Cere6ellum Дата: Понедельник, 11.11.2019, 10:51 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Cere6ellum Получается мы хотим получить значения, которые есть во всех трех массивах одновременно. Это так?

Да.
Этакий аналог сводной.
Но сводная не подходит.
Это лишь часть общей огромной реализации.
 
Ответить
Сообщение
Cere6ellum Получается мы хотим получить значения, которые есть во всех трех массивах одновременно. Это так?

Да.
Этакий аналог сводной.
Но сводная не подходит.
Это лишь часть общей огромной реализации.

Автор - Cere6ellum
Дата добавления - 11.11.2019 в 10:51
Апострофф Дата: Понедельник, 11.11.2019, 12:49 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 210
Репутация: 74 ±
Замечаний: 0% ±

Excel 1997
Cere6ellum, само напрашивается разнесение проверки по AND
        If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True And findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then

'Add to one-dimensional array

End If

на
[vba]
Код
        If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True THEN
          IF findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
        
            'Add to one-dimensional array
            
            
        End If
        End If
[/vba]
Это даст ускорение ~ в два раза.
А на порядки можно ускорить после сортировки массивов с дальнейшим бинарным поиском.


Сообщение отредактировал Апострофф - Понедельник, 11.11.2019, 12:50
 
Ответить
СообщениеCere6ellum, само напрашивается разнесение проверки по AND
        If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True And findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then

'Add to one-dimensional array

End If

на
[vba]
Код
        If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True THEN
          IF findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
        
            'Add to one-dimensional array
            
            
        End If
        End If
[/vba]
Это даст ускорение ~ в два раза.
А на порядки можно ускорить после сортировки массивов с дальнейшим бинарным поиском.

Автор - Апострофф
Дата добавления - 11.11.2019 в 12:49
InExSu Дата: Понедельник, 18.11.2019, 23:20 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 591
Репутация: 71 ±
Замечаний: 0% ±

Excel 2010
Привет!
Может быть кто-то уже сталкивался с подобным.

Сталкивался, создал класс массив двумерный с поиском по словарю. Во вложении. Для Вашего случая придётся оптимизировать метод заполнения массива данными.
К сообщению приложен файл: Dic_Array2_InEx.xlsb(20.4 Kb)


На сохранение второго закона термодинамики: яндекс.кошелёк 410012113235839
 
Ответить
СообщениеПривет!
Может быть кто-то уже сталкивался с подобным.

Сталкивался, создал класс массив двумерный с поиском по словарю. Во вложении. Для Вашего случая придётся оптимизировать метод заполнения массива данными.

Автор - InExSu
Дата добавления - 18.11.2019 в 23:20
doober Дата: Понедельник, 18.11.2019, 23:49 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 590
Репутация: 247 ±
Замечаний: 0% ±

Excel 2010
Какое можно найти решение в этой ситуации?

Я бы всю обработку в SQL перенес.
Заполнить таблицы и все вытянуть одним запросом.
Или для ускорения создать временную таблицу совпадения 2- х массивов и остальное обработать запросом.


 
Ответить
Сообщение
Какое можно найти решение в этой ситуации?

Я бы всю обработку в SQL перенес.
Заполнить таблицы и все вытянуть одним запросом.
Или для ускорения создать временную таблицу совпадения 2- х массивов и остальное обработать запросом.

Автор - doober
Дата добавления - 18.11.2019 в 23:49
Cere6ellum Дата: Понедельник, 02.12.2019, 13:05 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Всем спасибо.
Переосмыслил реализацию.
Заменил масивы словарями, т.к. в словарях поиск осуществляется быстрее, благодаря Exists.
Теперь всё работает значительно быстрее. И время выполнения<= 1 минуте.
 
Ответить
СообщениеВсем спасибо.
Переосмыслил реализацию.
Заменил масивы словарями, т.к. в словарях поиск осуществляется быстрее, благодаря Exists.
Теперь всё работает значительно быстрее. И время выполнения<= 1 минуте.

Автор - Cere6ellum
Дата добавления - 02.12.2019 в 13:05
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск в массивах на 1млн строк (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2019 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!