LMAX Disruptor - Поддерживать порядок событий
У меня есть приложение, которое загружает данные временных рядов из различных файлов. Приложение открывает один поток на файл для параллельной загрузки данных. Записи в файлах упорядочены, но мне нужно доставить один канал остальной части приложения, сохраняя порядок событий в целом.
Может ли это быть реализовано с использованием разрушителя, такого как несколько производителей, с одним типом дизайна, поддерживающим порядок событий?
В настоящее время я использую блокирующие коллекции и отсортированный список для сортировки заголовка каждой из блокирующих коллекций, но это занимает тонну памяти, и мне интересно узнать, реализовал ли кто-то другой подобный дизайн с использованием другой архитектуры.
Спасибо
1 ответ
Если вы перепроектируете что-то наподобие объектных потоков (фокусируйтесь на потоке), то загрузка из файла должна загружать только минимум памяти (какой бы размер буфера вам ни понадобился). Каждый поток предварительно выбирает 1 элемент заголовка.
Затем вы должны выполнить k-way слияние, чтобы выбрать самый низкий из N элементов. Вы бы поместили потоки в двоичное дерево. При получении наименьшего значения поток перемещается в дереве (свопы и вращения). Конечно, это значение O(log n), чтобы получить значение. Когда струя высохнет, удалите с дерева.
Это обобщение слияния двух отсортированных массивов; вам приходится прибегать к массивам по головам, что совершенно отличается от сортировки случайных наборов; у вас есть почти упорядоченный набор за исключением того, что 1 поток неуместен. Вы можете выполнить бинарный поиск, но эта повторная вставка будет дорогой в мем копиях. Повороты деревьев проще.
(и разрушитель не имеет ничего общего с этим... LOL)