|
|
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Прошу знатоков помочь с оптимизацией побайтового чтения и сравнения двух бинарных файлов! Ниже приведен несколько урезанный код самой процедуры... (прошу не пинать за возможно большой код... но иначе возможно было бы больше от Вас уточнений и ухода темы в сторону) Данная тема перекликается с моей же темой " Вывод в Memo японских иероглифов (932-я кодовая таблица) ", но об этом позже. Немного словесного описания: Процедура оперирует двумя бинарными файлами одинаковой длины: - OriginalFile - бинарный файл в котором встречаются английские и японские текстовые фразы (в 932 или 20932 -й кодировке) с лидирующими и замыкающими нулевыми байтами; - PerevedenFile - бин.файл созданный на основе предыдущего Оригинала, но японские фразы заменены на их английские аналоги, т.е. Переведены с учетом длины японской фразы включая Пред.и После-нули. Данный файл может быть "переведен" предварительно вручную или др.программой, это не важно! Задача процедуры - на основании информации из файлов OriginalFile и PerevedenFile сформировать текстовый файл PerevodFile со структурой, упрощенно похожей на XML, который можно будет открывать для просмотра в текстовом редакторе (в дальнейшем буду иметь ввиду " Notepad++ "), так и в "WinHex". Пришло время привести тестовые примеры этих Трех файлов, а затем - структуру выходного файла PerevodFile !? OriginalFile : PerevedenFile : PerevodFile : Но лучше на него взглянуть из " Notepad++ " (включена индикация "Всех" символов): Эхх - картинка длинная получилась!..((( Надеюсь на 14'-вом монике никто не читает?..) Или можно скопировать его сюда: Код: xml 1. 2. Правда упр.символов " CR " " LF " тут видно не будет! Иероглифы скорее всего - тоже не проявятся..(( Тогда попробую еще просто вставить (да простят меня Модераторы и Админы форума!): *#0082B182F182C982BF82CD000000#00476F6F64206D6F726E696E6700#こんにちは#Good morning#...You comments...## *#00834F836283688378834300#00476F6F6420626179000000#グッドベイ#Good bay#...You comments...## Внимательные глаза возможно уже сами увидели формат выходного файла!?..)) Сейчас останавливаться на нем больше не буду, если надо будет - распишу его структуру! Зачем я это все пишу и вставляю картинки? Да просто опережаю время, предвидя возможные наводящие вопросы и уточнения - стараюсь выложить всю начальную информацию! Ну а тем, кто дочитал до этого места - собственно попробую сформулировать свой вопрос согласно топика... Как видите - для чтения отдельных байт из файлов я использовал TFileStream , просто на этапе правильного составления алгоритма, так было удобней и легче! Но читать по одному байту - как то не очень шустро получается! Подскажите пожалуйста, для реализации данного алгоритма - какие варианты можно еще попробовать??? А тут сам код процедуры: Код: 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. Для побайтного-посимвольного накопления выходного файла я использовал TMemo с последующей процедурой удаления дублей строк (ее текст тут упущен..) и выгрузкой его в файл. Хотя наверное для этого можно использовать и TStringList !? - Надо попробовать его. Формат получаемого файла " Perevod " полностью меня устраивает, единственное, что никак не могу понять: MainMemo : При выводе в TMemo всего этого "bla-bla-bla...", вместо японских иероглифов присутствую совсем другие символы! (А в свойствах TMemo.Font зачем тогда присутствует выбор кодировки, в том числе 932 !? ) НО!!! - Вопрос по TMemo.Font - это совсем другая история и я уже начал по ней дискуссию ТАМ . P.S. В данном топике меня интересует прежде всего - варианты оптимизации чтения! (Ну а дальше - что позволят уважаемые Модераторы...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 15:11 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicПодскажите пожалуйста, для реализации данного алгоритма - какие варианты можно еще попробовать??? Можно начать отсюда https://www.google.com/search?q=delphi buffered file stream ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 15:41 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic(Ну а дальше - что позволят уважаемые Модераторы...) Модератор настоятельно советует не злоупотреблять оформлением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 16:07 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Я нифига не понял, чего тебе нужно. Изложи вопрос компактнее, пожалуйста От себя замечу, что UniConv поддерживает 932 и 20932 кодировки. А значит и CachedTexts поддерживает их. Значит ты можешь делать построчные Readln и вообще как угодно работать с текстом. Хоть через автокоррекцию в UTF8, хоть в Unicode, хоть в 51949 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 18:52 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 21:24 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUUniConv поддерживает 932 и 20932 кодировки. А значит и CachedTexts поддерживает их. дальше все про блох.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 21:55 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
wadmanМожно начать отсюда https://www.google.com/search?q=delphi buffered file stream wadman , Вам - большое спасибо за подсказку, а разработчикам за такой подарок - давно бы стоило это сделать!..) Замена TFileStream на TBufferedFileStream на тестовом примере от сюда ( Faster FileStream with TBufferedFileStream ) выдала офигительный результат - вместо 2491 msec, тест сработал за 31 msec (это более чем в 80 раз быстрее!) Только автор что-то там не так немного с подсчетом символа "#13" накрутил..) - я не стал разбираться. Тестовый код из статьи Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 10:28 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicДля побайтного-посимвольного накопления выходного файла я использовал TMemo Bellic... выдала офигительный результат - вместо 2491 msec, тест сработал за 31 msec (это более чем в 80 раз быстрее!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 11:08 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Глянул на исходники... Я уже писал вам в другой теме, что код вида Код: pascal 1. 2. 3. 4. 5. 6. и слово "скорость", взаимосвязаны примерно как гиппопотам и стратосферные полёты. Ради интереса, запустите своё приложение в режиме отладчика (с включенной опцией Use Debug DCUs ) и пройдитесь кнопкой F7 (Trace Into) по этому циклу, посмотрите сколько и какого кода там выполняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 11:35 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicwadmanМожно начать отсюда https://www.google.com/search?q=delphi buffered file stream wadman , Вам - большое спасибо за подсказку, а разработчикам за такой подарок - давно бы стоило это сделать!..) Замена TFileStream на TBufferedFileStream на тестовом примере от сюда ( Faster FileStream with TBufferedFileStream ) выдала офигительный результат - вместо 2491 msec, тест сработал за 31 msec (это более чем в 80 раз быстрее!) Только автор что-то там не так немного с подсчетом символа "#13" накрутил..) - я не стал разбираться. Тестовый код из статьи Код: 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. Чё-то не понял, у тебя же файл японский, а не юникодовый. Почему ты читаешь Char? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:07 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
И какой вообще смысл читать посимвольно файл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:09 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. А потом читаешь построчно: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. А посимвольно можно так. Для Char (WideChar) можно сделать быстрее, только расписывать не буду :) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:34 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
alekcvpГлянул на исходники... Я уже писал вам в другой теме, что код вида Код: pascal 1. 2. 3. 4. 5. 6. и слово "скорость", взаимосвязаны примерно как гиппопотам и стратосферные полёты. Ради интереса, запустите своё приложение в режиме отладчика (с включенной опцией Use Debug DCUs ) и пройдитесь кнопкой F7 (Trace Into) по этому циклу, посмотрите сколько и какого кода там выполняется. Рано я обрадовался!!! Замена TFileStream на TBufferedFileStream в реальной процедуре скорости ей не прибавила, и даже наоборот (было 193 сек, а стало - 196 сек)! И с Вам, alekcvp , я тоже полностью согласен, что вышеуказанный цикл "гиппопотамовский"! Индикация в Memo в принципе вообще не нужна, а произвести формирование Выходного файла думаю можно и в TStringList , а потом командой SaveToFile сохранить его в файле!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:38 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SoftForYouЧё-то не понял, у тебя же файл японский, а не юникодовый. Почему ты читаешь Char? Вообще то читаю и анализирую побайтно (ISimvol, PSimvol: Byte;) потому, что в Исходных файлах могут быть не только 2-х байтные, но и 1-байтные японские символы (932 и 20932-й кодировок), латиница, а так же просто например машинный код для процессора! SoftForYou , я ответил на Ваш вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:47 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SoftForYouИ какой вообще смысл читать посимвольно файл? Исходные файлы OriginalFile и PerevedenFile - это Бинарники, а не Текстовые! Это вообще-то "прошивки" для электронных устройств (машинный код!) с некоторым числом Текстовых фраз! По другому тут я думаю никак не получится! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:52 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellicэто Бинарники, а не Текстовые!Bellic, методичку по массивам почитай )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 14:38 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Тогда тебе нужен CachedBuffers По сути тебе нужен только CachedBuffers.pas Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Это самый быстрый способ побайтного чтения твоих файлов Но я думаю, скорость у тебя проседает не на чтении файлов, а в каких-то других местах, например, при переводе строки в юникод ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 14:57 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Попкорновый файлBellicэто Бинарники, а не Текстовые!Bellic, методичку по массивам почитай )) На предмет чего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 16:43 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Думал насчет использования массивов, но пока решил повременить... В общем отказался от TMemo для "формирования и накопления" строк и последующего сохранения его в файл... (Вывод в TMemo оставил только для информационных сообщений) Чтение бинарников оставил через TFileStream . Сейчас это выглядит примерно так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. В результате - время выполнения процедуры от 193 секунд уменьшилось до 87 ! (Забыл ранее упомянуть, что размер бинарников - каждый примерно по 10 Мбайт ) В принципе - результатом более или менее доволен, но думаю что можно еще подчистит код или попробовать другие варианты реализации, в том числе и с Массивами! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 01:16 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic(Забыл ранее упомянуть, что размер бинарников - каждый примерно по 10 Мбайт ) Копейки... Можно разом загрузить и не дергать чтение по байтам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 09:13 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicСейчас это выглядит примерно так: Код: pascal 1. 2. 3. 4. 1. При последовательном чтении Seek() делать не надо, Read[Buffer]() сама переносит указатель на Count позиций вперёд. 2. Для разнообразия: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 10:53 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Загрузи исходные файлы в память, так будет быстрее и удобнее А запись в файл у тебя очень долгая - ты постоянно перевыделяешь строки и используешь конкатенацию. Тебе нужно использовать TCachedTextWriter и TTemporaryString. В общем не очень ясно, зачем ты у нас что-то спрашиваешь, если вообще не прислушиваешься к тому, что мы говорим :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 11:48 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SoftForYouBellic, Тогда тебе нужен CachedBuffers По сути тебе нужен только CachedBuffers.pas я так понимаю - это компонент? Возможно попробую чуть позже... правда это утяжелит программу... wadman..Можно разом загрузить и не дергать чтение по байтам. Думаю Вы правы! Но в 2-х циклах из 4-рех идет не только побайтное чтение, но и анализ этих данных, да и обвязка для "загрузки разом" будет стоить некоторого кода..( alekcvp1. При последовательном чтении Seek() делать не надо, ReadBuffer]() сама переносит указатель на Count позиций вперёдЭто известно мне, Seek() остался от вырисовывания алгоритма, сейчас приведу в порядок где это возможно. Спасибо за подсказку! alekcvp 2. Для разнообразия: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ; SOFT FOR YOUЗагрузи исходные файлы в память, так будет быстрее и удобнееОтличная идея!!! Следующий вариант попробую именно его! А запись в файл у тебя очень долгая - ты постоянно перевыделяешь строки и используешь конкатенацию.Конкатенацию юзать удобно - не надо следить за указателем позиции. А запись в файл в свете варианта использования " TStringList ", выглядит одной строкой: Код: pascal 1. Тебе нужно использовать TCachedTextWriter и TTemporaryString. В общем не очень ясно, зачем ты у нас что-то спрашиваешь, если вообще не прислушиваешься к тому, что мы говорим :) SOFT FOR YOU , я думаю Вы зря обвиняете меня в невнимательности к предложениям пользователей! Замену TFileStream на TBufferedFileStream попробовал; От TMemo с позицированием в нем (типа " Memo.Lines[Memo.Lines.Count-1]:=Memo.Lines[Memo.Lines.Count-1] + '#'; ") тоже избавился. Массив частично заюзал - " SStroka: AnsiString; " - это же по сути тот же массив, но символьный!? ...при возможности - обязательно попробую предложенные Вами варианты... P . S . К сожалению (или к счастью?!) мы все люди (как ни странно...), а не машины! У каждого свои достоинства, недостатки и Время - для их приумножения или искоренения!... Спасибо Всем, за то что Вы сейчас со мной, здесь и сейчас!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 13:23 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, >Конкатенацию юзать удобно - не надо следить за указателем позиции. Удобно, но медленно. Указатель - всего лишь одна переменная + 1-2 строки кода. Многократное ускорение стоят того, что бы разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 16:48 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
makhaonBellic, >Конкатенацию юзать удобно - не надо следить за указателем позиции. Удобно, но медленно. Указатель - всего лишь одна переменная + 1-2 строки кода. Многократное ускорение стоят того, что бы разобраться. Ну я не стою на месте... Правда неудачно "выкосил" Seek , в результате чего сломался алгоритм и в выходном файле появились ошибочные данные...(( Будет время - пройдусь пошагово на тестовых файлах... А уже после этого - буду думать что еще можно оптимизировать! Хотелось бы дорешать этот вариант! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 17:37 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39572513&tid=2041399]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
179ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 519ms |

| 0 / 0 |
