|
Быстрая фильтрация большого массива данных listview
|
|||
---|---|---|---|
#18+
Есть возможность использовать Telerik. В общем нужно сделать listview с возможностью фильтрации по введенным в textbox тексту. Особенность что большое число записей - 200к или может даже больше. Они причем выгружаются сразу. Какой лучше всего выбрать элемент? Какой наиболее эффективный и быстрый? Какой поддерживает виртуализацию - и самое осоновное - как реализовать фильтрацию по тексту. В большинстве примеров - меняются всю коллекцию и обновляют элемент. Что естевственно совсем не производительно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 14:18 |
|
Быстрая фильтрация большого массива данных listview
|
|||
---|---|---|---|
#18+
glorsh66, а стандартный для WPF ICollectionView (CollectionViewSource) не справляется? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 21:53 |
|
Быстрая фильтрация большого массива данных listview
|
|||
---|---|---|---|
#18+
glorsh66, Вообще я потестил на обычном ListCollectionView и с 200000 записей, при небольшом объем данных по которым идет фильтрация, скорость обновления была приемлемой. Но если данные по которым осуществляется фильтрация (поиск вхождений) достаточно большие, а условие сложное и не особо быстрое, имеет смысл распараллелить процесс фильтрации (поиска вхождений) на множество ядер, судя по реализации ICollectionView этого не происходит. В результате прирост на таких данных у меня был в ~4 раза. Это не бог весть какой показатель, но подозреваю, что с ростом времени выполнения предиката, эта разница будет увеличиваться, относительно однопоточного варианта. На слабых процессорах прирост будет не таким хорошим, у меня i7. Вот реализация, это набросок который требует обдуманной доработки, писал на коленке: Это трудно назвать прокси классом и еще труднее представлением, но я так его назвал, смысл вроде понятен. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 00:32 |
|
Быстрая фильтрация большого массива данных listview
|
|||
---|---|---|---|
#18+
еще я в таких случаях делал Behavior, который обновлял содержимое поля FilterString, связанного с полем зависимости TextBox.TextProperty не по изменению, а через 300-400 мс после его последнего изменения, тогда если пользователь не куколд полный, можно за 1 запрос набрать больше 1 символа, ну или по кнопке Enter обновлять (дефолтное поведение). О том, что нужно нажать enter можно написать внутри текст бокса или еще как угодно. Такое количество записей за 1 раз пользователю нафиг не нужно. Их невозможно обозреть, так зачем они загружаются? возможно достаточно первой сотни. К примеру, список ошибок, если даже он будет больше 100, смысла больше показывать нет. Можно даже первой десяткой или парой ограничиться. Возможно нужен полнотекстовый поиск, а не то, что вы хотите. Если у вас сейчас такие объемы, что будет через пару дней\лет ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 01:35 |
|
Быстрая фильтрация большого массива данных listview
|
|||
---|---|---|---|
#18+
Roman Mejtes , в ListView же есть виртуализация. И ICollectionView будет фильтровать только отображаемые элементы, а не весь список. Или я ошибаюсь? Понимаю, что, допустим, для сортировки нужна обработка всего списка. Но фильтрация работает последовательно, и, вроде, не должно быть тормозов для большого списка. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2021, 15:02 |
|
Быстрая фильтрация большого массива данных listview
|
|||
---|---|---|---|
#18+
Eld Hasp Понимаю, что, допустим, для сортировки нужна обработка всего списка. Именно всего вне зависимости от виртуализации и количества отображаемых элементов. Eld Hasp Но фильтрация работает последовательно, и, вроде, не должно быть тормозов для большого списка. Только она работает в GUI-потоке, и при более-менее сложной структуре визуального дерева элемента списка+более-менее сложной логике фильтрации (бывает, что достаточно просто фильтрации по регэкспу) тормоза становятся ощутимыми (не в нижеприведенном примере, но, тем не менее). Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2021, 17:06 |
|
Быстрая фильтрация большого массива данных listview
|
|||
---|---|---|---|
#18+
Суть моего примера как подключить параллелизм в фильтрацию, очевидно. что на данных из примера, простой способ (стандартный) будет тормозить, поиск заниматься 1,5 секунды на 2-3 символе, это уже явно ощущается. С AsParallel 100-200 мс. С экземпляром Regex пробовал, скорость не сильно выше, чем с IndexOf. Удобно еще и тем, что при таком использовании фильтрации, все происходит прозрачно для конечного списка. Как вариант, в том же представлении коллекции где осуществляется фильтрация, можно сделать порционную загрузку Самый большой минус, при изменении исходной коллекции, это будет порождать сброс коллекции и её перестройка. Но это решаемо. Но с таким объемом и количеством я не сталкивался, по этому в реальной жизни такого не применял, так как при 100 000к записей с разумным количеством информации всё летает без всяких выкрутасов. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2021, 18:19 |
|
|
Start [/forum/topic.php?fid=21&fpage=1&tid=1440253]: |
0ms |
get settings: |
25ms |
get forum list: |
24ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
16ms |
get forum data: |
3ms |
get page messages: |
213ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 366ms |
0 / 0 |