Скорость поиска данных в системной памяти - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть приложение, которое обрабатывает сканирование транзакций с ручных терминалов на складе.Каждое сканирование (которых может быть сотни тысяч в течение дня) должно искать место выбора (опять же которых могут быть сотни тысяч), чтобы найти его «физическое местоположение».Чтобы получить скорость обработки, мне нужно, чтобы я вытащил весь список местоположений в словарь, чтобы он находился в оперативной памяти, но, естественно, это влияет на системную память, и каждые несколько дней я получаю сообщения об ошибках системы.система постоянно работает на виртуальном сервере).Мои вопросы тогда: мой подход разумен?Является ли это (как я считаю) самым быстрым способом доступа к данным один раз в системе?Есть какие-нибудь идеи по поводу проблемы с памятью?

For x = 1 To MapBindingSource.Count
    Dim B As New Bin
    B.LocationID = MapBindingSource.Current("LocationID")
    B.x = MapBindingSource.Current("X")
    B.y = MapBindingSource.Current("Y")
    B.z = MapBindingSource.Current("Z")
    'etc...    

        Try
            BinDictionary.Add(B.LocationID, B)
        Catch ex As Exception
            msgbox("Error message here")
        End Try

     MapBindingSource.MoveNext()
Next

1 Ответ

0 голосов
/ 04 апреля 2019

Разумный вопрос - это вопрос мнения, который полностью зависит от обстоятельств (например, сколько данных, насколько мощное оборудование, насколько быстрым оно должно быть, каков формат данных). Dictionary использует хеш-таблицу для индексации данных. Будет ли это структура данных самая быстрая , чтобы использовать все, зависит от данных и от того, как часто, если когда-либо, они изменяются. Существует множество других популярных структур данных, которые могут быть лучше - некоторые встроены в .NET (например, HashSet, SortedList, SortedDictionary), а многие - нет. Но это очень широкая тема.

Самый распространенный способ решить эту проблему - использовать хороший движок базы данных с правильно настроенной базой данных. В большинстве случаев база данных должна иметь почти такую ​​же производительность, поскольку она будет индексировать все, используя лучшие структуры данных для работы, и эффективно кэшировать все в памяти. Он не только справится со всей этой работой для вас, но также добавит больше возможностей, которые вы могли бы использовать в будущем. Если вы уже используете базу данных, я бы предложил попробовать другие механизмы и конфигурации, потому что не должно быть таким медленным.

Что касается нехватки памяти, самый простой ответ - сказать, что это не должно быть проблемой, если вы измените процесс на 64-битный. Когда приложение выполняется как 32-разрядный процесс, оно ограничено 2 ГБ или памятью (а если учесть затраты и фрагментацию, обычно оно ближе к 1,5 ГБ). Когда он работает как 64-битный, он получает намного больший объем памяти, почти наверняка больше, чем физическая RAM и виртуальная память на машине, поэтому вы ограничены только количеством оборудования, которое вы хотите использовать. Однако то, как вы описали ситуацию, звучит подозрительно. Если вы загружаете все данные в память при запуске, и именно из-за этого у вас кончается память, она должна сразу завершиться с исключением из-за нехватки памяти. Если он не работает в течение дня или двух, возможно, у вас утечка памяти в вашем приложении. В этом случае переключение на 64-разрядную версию сделает его более продолжительным, но только задержит неизбежное.

...