Знание моих структур данных является ржавым, и, честно говоря, это никогда не было моим самым сильным моментом.
Сейчас мы собираемся создать компонент, похожий на очередь, который имеет следующие требования:
- Должна быть в очереди очередь, деактивация и поиск определенного элемента по ключу.
- каждый элемент будет структурой или классом с другим классом в качестве ключа, имеющим 5 различных свойств, похожих на категорию. Предположим что-то вроде: MasterCategoryId, ChildCategoryId, TimeId, PriorityId, GroupId.
- это должна быть коллекция сортировок.
- обычно коллекция будет храниться где угодно от 5k до 10k объектов, но для того, чтобы рассмотреть наихудший сценарий, мы тестируем наш прототип для хранения около миллиона объектов.
- сейчас он не будет многопоточным.
- около 90 или 95% элементов в коллекции (очередь) будет происходить, когда компонент будет создан, но компонент используется как дерево, в том смысле, что мы будем деактивировать последний элемент коллекции, выполните вычисления на нем, а затем он сообщит об этом результат своему родительскому элементу, который уже может быть или не быть в коллекции. Если это не так, метод очереди, используемый для поиска родителя, должен будет вставить элемент.
- поскольку компонент похож на обработанную очередь, коллекция будет пуста после удаления всех объектов.
Думаю, это подводит итог. поэтому, очевидно, единого списка или упорядоченного списка не может быть и речи, из-за того, что каждый раз, когда мы добавляем или удаляем объекты из коллекции, он сортируется снова, и выполнение этого в одной коллекции с миллионом объектов происходит медленно.
Мы протестировали несколько подходов в прошлом, например, связанные списки, которые оказались быстрыми для очередей, но медленные для поиска элементов (поскольку у нас есть этот сценарий).
Прямо сейчас мы создали структуру вроде
SortedDictionary<int, SortedDictionary<int, SortedDictionary<int, SortedDictionary<int, SortedDictionary<int, ..
Вы получаете идею.
Это своего рода сладкое пятно группировки уровней, сохраняя каждую коллекцию относительно небольшой (около 300 предметов на словарь).
поэтому для первого уровня у нас будет отсортированныйdictionary, для которого ключи являются идентификаторами каждой главной категории, а значения будут отсортированы в соответствии с этим словом, ключ которого будет идентификатором дочерней категории... и т.д.
Сейчас мы тестировали 100, 1000, 10000, 100 000 и 1 000 000 элементов.
Для меньшего диапазона, до 100 тыс., решение выполняется быстро. он может стоять в очереди/деактивировать/находить менее секунды, даже до 300 тыс., что действительно выше 80-90% сценариев, которые мы будем обрабатывать.
Когда дело доходит до миллиона, он становится медленнее, занимая около 3-4 секунд, чтобы поставить в очередь все это и до 10 секунд, чтобы истощить очередь.
Итак, мои вопросы:
- Есть ли более подходящий набор или подход для нашего конкретного сценария?
- Я никогда раньше не работал с этим количеством предметов в коллекциях. Являются ли эти сроки разумными для таких высоких чисел, или нет? Я прошу, потому что я прочитал некоторые твиты людей, которые выполняют 200 000 операций в секунду на таких вещах, как MSMQ или NserviceBus (которые, как я знаю, не связаны с этим, я просто пытаюсь понять и сравнить мои результаты).
- Объекты, которые я использую прямо сейчас в прототипе, представляют собой только макеты классов, просто составной ключ объекта и одно свойство. Могут ли повлиять на мои результаты, когда я буду использовать реальные классы или нет? Я предполагаю, что нет, поскольку вся инфраструктура будет делать, это добавить ссылку на объект, но просто хочу подтвердить, поскольку, как я уже сказал, структуры данных никогда не были моими самыми сильными знаниями.
- В качестве отдельной темы, если бы я хотел подготовить для этого многопоточность, каковы некоторые соображения, которые я должен был бы предпринять?
Спасибо.