|
|
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, нашёл баг Время реальное - 0,148925 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 19:52 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Няшик, Ранее ты опубликовал 21 лексему. Я уже пилю пример для них. Запили аналогично Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 19:56 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Няшик вообще то задача найти в тексте позиции содержащие слова из группы заданых строк, а не разложить его на лексемы например, провести следующие подстановки 'abc' -> '1' 'abe' -> '2' .... для порядка будем считать, что формально происходит последовательная подмена Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:03 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Так никто же не спорит Просто Няшик предлагает деревья, а я предлагаю хеши И мы рассматриваем частный случай его парсера, где набор искомых строк изначально известен, а значит, его можно захардкодить. Стандартный case по большому счёту и есть частный вид поиска по бинарному дереву ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:09 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, kealon(Ruslan)вообще то задача найти в тексте позиции содержащие слова из группы заданых строк, а не разложить его на лексемы"разложение на лексемы" куда более примитивная задача ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:17 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Привет всем! Я смотрю выходные даром не проходят - тема Топика переместилась в спор Ассов!?..)) Ну и у меня есть результат - допилил реальную свою процедуру на основе RawByteString и Pos() ... Для начала скажу, что та же процедура, но с куском кода на разных "платформах", на одних и тех же входных файлах, дала следующие результаты: - Memory -- 15-17 sec - TByte -- 92-93 sec - Raw+Pos -- 3-4 sec Размер входных файлов: - Бинарник в котором нужно искать и заменять - 10 Мбайт - Файл с данными для Поиска и Замены содержащий 357 пар (время на распарсивание его тоже тратится) - 48 Кбайт Количество произведенных замен - 526 Сам код получился достаточно коротким, но пришлось пошагово выловить несколько ошибок: =Поиск и Замены на RawByteString + Pos() Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Ну и пару вопросов по RawByteString : - если в переменной этого типа уже есть данные, то следующее присваивание новых - выдает не правильный результат, в отличии от Sting?! Может быть тут есть оператор позицирования? Или же нужно тоже указывать начальную позицию? т.е. вместо Код: pascal 1. писать Код: pascal 1. ???) (мне пришлось делать RawPoisk=''; и RawZamena=''; ) - при записи в файл указал начало: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:21 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Конечно же ускорить всю процедуру можно, но для этого потребуется всю ее перелопатить! Я же сравнивал быстродействие, меняя чисто отдельный блок кода , отвечающий за Поиск и Замену! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:28 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Bellic, ну чтож, значит с задачей угадали, однозначно Рефал переизобретён ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:29 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Bellic, Выложишь тестовый проект ??? С файлами, с примером что должно получится. И так далее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:29 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
В общем у меня готова реализация, которую можно назвать демонстрационной Идея родилась как раз, когда Няшик мучил нас своими простынями нагенерированного кода для парсера Причём огромная часть токенов имело вид <= >= == $ " >>> + - >>= и прочая штукенция Сначала я сделал табличное преобразование первого символа. От case уйти не удалось, но зато появилась возможность сделать его последовательным, т.е. на x86 бинарное дерево поменять на jmp [eax * 4 + offset], т.е. сделал некое подобие хеша. Соответственно и для задачи ТС предлагалось сделать array[Char] для первого символа, чтобы оперативно определять, символ S[i] является первым символом одной из искомых строк или нет. Вообще array[Char] - это частный быстрый вид хеша, его минус расход памяти, поэтому применим не всегда, но для первого символа - самое то. Так вот, возвращаясь к задаче Няшика, я постоянно настаивал на том, что для скорости компиляции лучше использовать байтовую кодировку (UTF-8, например). Потом возникла мысль, что можно "хешировать" сразу 2 символа, но тогда понадобится 64Кб таблица. А потом возникла мысль, что можно "хешировать" сразу 3 символа, причём это может занять значительно меньше памяти, а все операторные лексемы (типа <= >= ===) будут охвачены, уйдут простыни кода и многочисленные ошибки предсказаний ветвлений. Вот пример. Код: 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. Вот что на выходе: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Но многобуквенные лексемы я бы как-нибудь приспособил под универсальный компаратор, честно говоря. Это вообще не та ситуация, где нужно использовать кодогенерацию, ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:34 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Да, и тут у меня спрашивали - включена ли "Оптимизация"? Т.к. сравнивать время выполнения начал еще при Выкл., то для чистоты экспериментов - далее ее не включал! А вот скажите мне пожалуйста - почему она не включена "По умолчанию"? Кстати - переход в режим Релиза, тоже даст результат, но я пока тестировал все в Дебаге! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:35 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Убедительная просьба - заведите пожалуйста для своих споров ОТДЕЛЬНУЮ тему!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:37 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)SOFT FOR YOU, kealon(Ruslan)вообще то задача найти в тексте позиции содержащие слова из группы заданых строк, а не разложить его на лексемы"разложение на лексемы" куда более примитивная задача Согласен, что примитивная. Так как можно захардкодить. Но зачем ты мне это пишешь? Я ещё раз акцентирую твоё внимание - вопрос поиска подходящих вершин по Ахо-Корасику: деревьями или хешем :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:37 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Bellic, ну чтож, значит с задачей угадали, однозначно Рефал переизобретён Не совсем понял о чем речь? - Можно поподробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:38 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
BellicSOFT FOR YOU, Убедительная просьба - заведите пожалуйста для своих споров ОТДЕЛЬНУЮ тему!!! В споре рождается истина Ты просил быстрый поиск нескольких строк или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:39 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Кстати Здесь была интересная ветка про StringReplace, но её, похоже затёрли. Так вот основная проблема StringReplace с множеством вхождений - в реаллоке памяти. Особенно, если речь идёт о нескольких мегабайтах. Решение следующее. Мы анализируем всю строку и создаём массив структур вида <Указатель, Длина>, где Указатель это либо часть исходной строки, либо заменяемая строка. Таким образом, когда анализ исходной строки заканчивается - мы имеем полное представление о результате. Сначала подсчитываем результирующую длину, выделяем требуемое количество памяти, потом последовательно заполняем результат нашими "кусками данных". Там проблема была в том, где хранить массив структур <Указатель, Длина>. В качестве решения был базовый массив на стеке, а при нехватке дополнительно выделялись буферы в куче. На практике всегда хватает стека, но для общего случая реализация тоже подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 22:56 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
НяшикВыложишь тестовый проект ??? С файлами, с примером что должно получится. И так далее А история то начиналась еще с Мемори вот в этом Топике: Поиск и Замена последовательности байт в бинарном файле До этого была жуткая по времени (24 часа) реальная процедура на реальных файлах - на TFileStream , позже выделенный желтым участок кода был переделан на TByte , а сейчас вот на RawByteString ...))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 23:02 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, А почему код не полны ? Сам меня тыкал выложить полный. А сам свой не выложил. Кстати, у меня UTF8 может обрабатывать, а твой только AnsiString. Как то немного не честно будет.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 23:11 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Няшик, Ну во-первых, тут без разницы. Можно хоть PAnsiChar указывать с нулём на конце. Во-вторых, ты свой тест так и не выложил, чтобы сравнить. В-третьих, что не хватило для компиляции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 23:21 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНяшик, Ну во-первых, тут без разницы. Можно хоть PAnsiChar указывать с нулём на конце. Во-вторых, ты свой тест так и не выложил, чтобы сравнить. В-третьих, что не хватило для компиляции? Как не выложил? 21123284 Не хватает THIRD_CHARS и THIRD_CHARS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 23:30 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Няшик , SOFT FOR YOU , я Вам не мешаю???..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 23:32 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2018, 23:36 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
НяшикSOFT FOR YOUНяшик, Ну во-первых, тут без разницы. Можно хоть PAnsiChar указывать с нулём на конце. Во-вторых, ты свой тест так и не выложил, чтобы сравнить. В-третьих, что не хватило для компиляции? Как не выложил? 21123284 Не хватает THIRD_CHARS и THIRD_CHARS Я же тебе чёрным по белому написал. Выложи код для 21 токена и байтовой кодировки: 21123290 А таблички я генерю, завтра выложу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2018, 00:35 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Bellic Няшик , SOFT FOR YOU , я Вам не мешаю???..))) Мы обсуждаем твою тему. Что тебя не устраивает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2018, 00:36 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUКстати Здесь была интересная ветка про StringReplace, но её, похоже затёрли. Так вот основная проблема StringReplace с множеством вхождений - в реаллоке памяти. Особенно, если речь идёт о нескольких мегабайтах. Решение следующее. Мы анализируем всю строку и создаём массив структур вида <Указатель, Длина>, где Указатель это либо часть исходной строки, либо заменяемая строка. Таким образом, когда анализ исходной строки заканчивается - мы имеем полное представление о результате. Сначала подсчитываем результирующую длину, выделяем требуемое количество памяти, потом последовательно заполняем результат нашими "кусками данных". Там проблема была в том, где хранить массив структур <Указатель, Длина>. В качестве решения был базовый массив на стеке, а при нехватке дополнительно выделялись буферы в куче. На практике всегда хватает стека, но для общего случая реализация тоже подходит.Зачем так сложно? Выдели изначально памяти с запасом, потом урежешь. Вот и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2018, 01:20 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39587602&tid=2041298]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
187ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 510ms |

| 0 / 0 |
