|
|
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Написал в целях повышения квалификации код поиска в файле с использованием MMF Код: pascal 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. В целом работает, но есть небольшая проблема - сходу не нашел функцию, аналогичную StrPos, но с поиском по строке заранее известной длины. Пришлось выдернуть из SysUtils и подправить. Есть ли готовая такая функция? Ну и вообще, все ли тут в порядке, есть ли что расширить и углубить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 12:51 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 13:27 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
makhaon, спасибо, с ней процентов на 10-15 побыстрее стало: Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 06:34 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
странно, StrPos написана на inline-ассемблере (по крайней мере, в Delphi 6) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 13:37 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Кроик Семён странно, StrPos написана на inline-ассемблере (по крайней мере, в Delphi 6) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 13:39 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Кроик Семён странно, StrPos написана на inline-ассемблере (по крайней мере, в Delphi 6) Fktrc Пришлось выдернуть из SysUtils и подправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 05:02 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Fktrc, В файле, большем чем размер RAM искать будет?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 10:06 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
alekcvp Fktrc, В файле, большем чем размер RAM искать будет?.. Судя по декларации из доков, SearchBuf обломается даже на 2+ Гб (Integer) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 10:56 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
alekcvp, эта версия нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 12:43 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
alekcvp, А эта да. Файл мапится поблочно, проверял на файле, превышающем размер озу в 2 раза. В процессе поиска память не росла. Искомое намеренно располагалось в конце файла, чтобы весь файл был прочитан. Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 13:16 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Fktrc В процессе поиска память не росла. Искомое намеренно располагалось в конце файла, чтобы весь файл был прочитан. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 13:21 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Barmaley57 Если имеется ввиду рабочий набор, то он и не должен расти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 13:29 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Barmaley57 блоками по 256kb вроде как ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 14:05 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Для поиска подстроки есть алгоритмы побыстрее простого посимвольного сопоставления. https://ru.wikipedia.org/wiki/Поиск_подстроки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 17:39 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
RWolf Для поиска подстроки есть алгоритмы побыстрее простого посимвольного сопоставления. https://ru.wikipedia.org/wiki/Поиск_подстроки В догонку: https://habr.com/ru/post/307220/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 17:49 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Использован поиск подстроки по алгоритму Кнута - Морриса - Пратта. Программа может принимать третьим параметром число прогонов поиска по файлу, чтобы вычислить среднее время. Код: pascal 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. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. Итого результаты Код: plaintext 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. 6881/7811 = 0,88 - ускорение еще в ~1,13 раза... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2019, 13:23 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Fktrc, 1. Массив префикс-функции я бы сделал глобальным, чтобы не дёргать всё время память туда-сюда. 2. "на случай, если искомое находится на границе между блоками, отступаем назад на длину искомого с учетом гранулярности смещения", - если у нас есть глобальная префикс-функция, то мы можем по её значению в этой точке точно узнать: может ли искомое находиться на границе между блоками и сколько символов из старого буфера необходимо сохранить (= её значению). Но это уже красивости, вряд ли они дадут какой-либо заметный выигрыш в скорости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2019, 18:30 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Ну и до кучи здесь: https://www.agner.org/optimize/asmlib.zip есть ф-я A_strstr, которая быстрее стандартной Pos раз в 10, за счёт использования специальных инструкций из SSE4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2019, 20:49 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Sapersky Ну и до кучи здесь: https://www.agner.org/optimize/asmlib.zip есть ф-я A_strstr, которая быстрее стандартной Pos раз в 10, за счёт использования специальных инструкций из SSE4. Из-за этого поиск по бинарному файлу невозможен. Нужна версия, которая ищет по буферу заранее известного размера. А сам я переделывать ее, конечно же не буду)) да и не смогу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2019, 05:47 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Fktrc Использован поиск подстроки по алгоритму Кнута - Морриса - Пратта. Программа может принимать третьим параметром число прогонов поиска по файлу, чтобы вычислить среднее время. патч, а то по запарке прошляпил: Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2019, 06:12 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Fktrc Нужна версия, которая ищет по буферу заранее известного размера. А сам я переделывать ее, конечно же не буду)) да и не смогу. https://www.strchr.com/strcmp_and_strlen_using_sse_4.2 в комментариях пишут, что самый быстрый вариант - на SSE2 с использованием _mm_cmpeq_epi8 (команда pcmpeqb). Вообще если искать в больших файлах, которые не в кэше, то упираться будет скорее в диск, даже если это SSD. Я бы попробовал сделать асинхронное чтение очередной порции, то есть прочитали фрагмент, даём команду на чтение следующего и одновременно ищем в текущем. Не через MMF, а ReadFile с FILE_FLAG_OVERLAPPED. Хотя не знаю, получается ли там реальная асинхронность на практике, не пробовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2019, 18:27 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Sapersky Я бы попробовал сделать асинхронное чтение очередной порции, то есть прочитали фрагмент, даём команду на чтение следующего и одновременно ищем в текущем. Не через MMF, а ReadFile с FILE_FLAG_OVERLAPPED. Хотя не знаю, получается ли там реальная асинхронность на практике, не пробовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2019, 21:12 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
А как FILE_FLAG_NO_BUFFERING помогает? Я, кстати, не замечал от него эффекта, когда-то пробовал для тестирования, чтобы Винда не кэшировала файл - но заметной разницы в скорости не было, то есть видимо всё равно кэшировала. Тем временем доделал поиск подстроки на SSE2. Быстрее для длинных строк/буферов, для коротких медленнее. https://drive.google.com/open?id=1zVWYmnSq0Lki4_8Ju9E9jnYHHkhKqZvD А Кнут - Моррис - Пратт втроём не смогли забороть одного Л.Толстого. Как я понял, смысл алгоритма в том, чтобы быстро обрабатывать частичные совпадения с подстрокой. Если их мало или нет, то и эффекта от алгоритма нет, получается даже медленнее стандартной Pos (наверное потому, что она на ассемблере). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2019, 13:57 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Sapersky А как FILE_FLAG_NO_BUFFERING помогает? Я, кстати, не замечал от него эффекта, когда-то пробовал для тестирования, чтобы Винда не кэшировала файл - но заметной разницы в скорости не было, то есть видимо всё равно кэшировала. Тем временем доделал поиск подстроки на SSE2. Быстрее для длинных строк/буферов, для коротких медленнее. https://drive.google.com/open?id=1zVWYmnSq0Lki4_8Ju9E9jnYHHkhKqZvD А Кнут - Моррис - Пратт втроём не смогли забороть одного Л.Толстого. Как я понял, смысл алгоритма в том, чтобы быстро обрабатывать частичные совпадения с подстрокой. Если их мало или нет, то и эффекта от алгоритма нет, получается даже медленнее стандартной Pos (наверное потому, что она на ассемблере). Если в начале FormShow поставить SetPriority(True, True) ; то результаты для Pos, Agner/SSE4, SSE2 - не изменятся вообще, а вот для KMP улучшатся ровно в два раза ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2019, 15:08 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Sapersky, когда-то обсуждали на другом форуме скорость "простого" поиска и упрощенного БМХ (Бойер-Мур-Хорспул). Пришли к выводу, что выигрыш есть для относительно длинных строк, а для искомой подстроки длиной до 6 символов разницы практически нет. Оценки сложности алгоритмов есть вот тут https://ru.wikipedia.org/wiki/Поиск_подстроки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2019, 15:11 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=56&tid=2038792]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 390ms |

| 0 / 0 |
