Слабое место VirtualQueryableCollectionView от Telerik
Несколько лет назад, занимаясь разработкой на WPF, открыл для себя компоненты от Telerik.
В целом качество и предлагаемый функционал меня устраивал, поэтому я активно подсаживал работодателя за работодателем на эти компоненты.
И была одна «серебряная пуля», которую я использовал всегда в случае необходимости показа больших коллекций с сервера на клиенте. Это была связка из RadGridView и VirtualQueryableCollectionView в качестве его ItemsSource. Алгоритм там довольно прост. Пользователь прокручивает грид, грид лезет за элементами, VirtualQueryableCollectionView стреляет события, что ему необходимы элементы, и я в фоне подгружаю нужные странички с сервера. Всё было хорошо и этот приём срабатывал много лет.
Но недавно был заряжен проект биржи криптовалют. Среди основных критериев оценки пользователем биржи есть курс и ликвидность. Чтобы соответствовать ожиданиям пользователей, был заряжен бот, который по API генерировал ордера. Т.к. волатильность курса криптовалют высока, ордера часто приходилось отменять и выставлять новые.
И вот однажды софт бэкофиса биржи стал падать с OutOfMemoryException. Профайлер показывал следующее.
Тысячи новых объектов System.Object[]. При этом в моём коде ничего не происходило, не было новых запросов к серверу, не было ничего, что я мог бы подозревать в таком стремительном пожирании памяти.
Просветление наступило, когда я объяснял коллеге симптомы. Смысл в следующем. В момент загрузки страницы в коллекцию VirtualQueryableCollectionView, я сообщаю ей полное количество элементов списка на сервере. И VirtualQueryableCollectionView внутри себя держит список, равный по количеству элементов, но наполненный пустышками. Я думаю, что как раз System.Object[]. И вот, когда количество элементов на сервере пошло на десятки миллионов (спасибо боту), этот список не выдержал. Да, если перевести процесс на x64, то он не так быстро сдается, но работать тоже невозможно, т.к. изменение размера этого списка занимает почти минуту.
Вот такая вот сказка про виртуализацию списка и серебрянную пулю.
P.S. Я понимаю, что пользователю на интерфейсе незачем просматривать коллекции такого объёма. Смысл текста поделиться опытом с коллегами и, возможно, сэкономить кому-то время в будущем.