|
|
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Привет всем. Собственно сабж, какой метод лучше для обработки больших строк? Задачка следующая: Есть файл, большого размера, файл вытащенный из базы, и разделенный не нормально Поэтому приходится, посимвольно прочитывать и парсить, и нормально разделять, т.е. скажем ненормальный CSV, пропарсить в нормальный CSV Я делаю так: 1. Считываю весь файл в строковую переменную 2. Обрабатываю строку, при этом результат собираю в строковой переменной 3. Записываю результат в файл Но в данном случае все прога работает медленно, в алгоритме, в принципе проблем нет, так как когда я использую вариант, при котором промежуточныйрезультат не собирается в строковую переменную, а сразу записывается в файл, прога работатет гораздо быстрее. Поэтому нужен метод, который работает гораздо быстрее, чем свои строковые функции VB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 13:57 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
> Автор: orunbek > Привет всем. > Собственно сабж, какой метод лучше для обработки больших строк? > > Задачка следующая: > Есть файл, большого размера, файл вытащенный из базы, и разделенный > не нормально > Поэтому приходится, посимвольно прочитывать и парсить, и нормально > разделять, т.е. скажем > ненормальный CSV, пропарсить в нормальный CSV Попытатася сделать "нормальный" CSV сразу при вытаскивании из базы, но я так понимаю формат CSV был приведён для примера и используется что-то другое. > > Я делаю так: > 1. Считываю весь файл в строковую переменную > 2. Обрабатываю строку, при этом результат собираю в строковой > переменной > 3. Записываю результат в файл > > Но в данном случае все прога работает медленно, в алгоритме, в > принципе проблем нет, > так как когда я использую вариант, при котором промежуточныйрезультат > не собирается в строковую переменную, а сразу записывается в файл, прога > работатет гораздо быстрее. Это нормальный вариант читать блоками и обрабатывать блок, а не сразу фесь файл. для блока объявлять строку для считывания так: Код: plaintext перераспределение строки в памяти. > Поэтому нужен метод, который работает гораздо быстрее, чем свои > строковые функции VB В зависимости от нужд преобразования можно попробовать использовать внешную утилиту, например gsar121.zip, General Search And Replace on files. (Documentation & Source). The archive contains a WIN32 executable. Вообщем тебе видней ;-) Удачи Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 14:43 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Спасибо за советы, попробую блоками, посмотрим скорость о результатах напишу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:10 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
черт, блоками не получится исходные данные у меня в строковой переменной идет к базе доступа нет, скажем, мне дали тот CSV, который есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:14 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
авторпри этом результат собираю в строковой переменнойКаким методом собирается строка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:30 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
> Автор: orunbek > черт, блоками не получится > исходные данные у меня в строковой переменной идет > > к базе доступа нет, скажем, мне дали тот CSV, который есть Ничего не понял :) если это CSV то в строке данные разделены запятой, а строки vbCrLf при чтении из файла Line input будешь читать строку(блок) вот пример из справки к Екселю: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:33 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Код: 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. 35. 36. 37. 38. 39. 40. 41. 42. 43. и ClearCRLF Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:34 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Понятно, самым медленным способом - конкатенацией. Стыдно должно быть за незнание других. Оформить в класс и юзать вместо &: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:39 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
> Автор: orunbek > В параметрах входная строка, А какая строка на вход дается? Кусочек можно? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:39 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Заодно ознакомиться с тынцем . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:40 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Еще пара моментов: если работа все равно происходит посимвольно, лучше перед парсингом конвертировать строку в байтовый массив, проверки типа strTemp = "," будут быстрее. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:44 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Косяков предостаточно. Можно упростить это: авторSub ClearCRLF(strInputString as String) Dim strResult$ strInputString = Replace$(strInputString, vbCr, "") strInputString = Replace$(strInputString, vbLf, "") strInputString = Trim$(strResult) End Sub strInputString был объявлен как variant - двойная неявная конвертация. Передача параметра ByVal медленнее ByRef. И вообще передача параметров в VB - операция тормозная. Лучше эти строчки переместить в основной цикл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:50 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Ошибся... Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:51 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос > Автор: orunbek > черт, блоками не получится > исходные данные у меня в строковой переменной идет > > к базе доступа нет, скажем, мне дали тот CSV, который есть Ничего не понял :) если это CSV то в строке данные разделены запятой, а строки vbCrLf при чтении из файла Line input будешь читать строку(блок) вот пример из справки к Екселю: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Posted via ActualForum NNTP Server 1.4 Я же говорил что это "неправильный CSV", это просто текстовый файл, в котором значения разделены запятыми, а строки vbCrLf, только в определенных, некоторые строки не разделяются, они сливаются, и это делается беспорядочно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 17:52 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Вот как оно должно выглядеть в идеале: Код: 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. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 18:01 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
А вернее так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 18:05 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
AntonariyКосяков предостаточно. Можно упростить это: авторSub ClearCRLF(strInputString as String) Dim strResult$ strInputString = Replace$(strInputString, vbCr, "") strInputString = Replace$(strInputString, vbLf, "") strInputString = Trim$(strResult) End Sub strInputString был объявлен как variant - двойная неявная конвертация. Передача параметра ByVal медленнее ByRef. И вообще передача параметров в VB - операция тормозная. Лучше эти строчки переместить в основной цикл. проморгал, я сначал скрипт написал, потом в VB переделывал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 18:05 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
А совсем хорошо так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 18:08 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Спасибо Antonariy, большое Сейчас уже на 2 минуты быстрее, попробую вариант с массивом о результате напишу :) Спасибо еще раз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 18:09 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Чей-то я увлекся))) Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 18:13 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Когда исправил ClearCRLF, работать стал на 2 минуты быстрее, вариант с массивами и с классом - на 4 минуты, только выходные данные уже некорректные ;) Но, в принципе я понял, переделаю под вариант с массивами Но все равно спасибо! Супер! AntonariyПонятно, самым медленным способом - конкатенацией. Стыдно должно быть за незнание других. Про это действительно не слышал, может быть, из-за того что раньше не приходилось обрабатывать большие текстовые файлы ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 18:15 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
AntonariyЗаодно ознакомиться с тынцем . супер сайт! спасибо за ссылку! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 18:18 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
А вам в массив все перекинуть не подойдет? Я парсил HTML-код по следующим образом Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2008, 18:44 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
Chelovek TapokА вам в массив все перекинуть не подойдет? Насчет этого незнаю, так как уже нашел приемлемый метод, единственное класс, который предложил Antonariy заменил на этот: Fast String concatenation with the String Class Отличие класса в том, что конкатенация делается через API CopyMemory Обработка строки теперь делается за 15 секунд ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2008, 10:36 |
|
||
|
Какой метод лучше для обработки больших строк?
|
|||
|---|---|---|---|
|
#18+
А вы попробуйте мой вариант (у меня самые объемные страницы обрабатываются не более чем за 2 сек), большая часть времени уходит на скачивание. P.S. Мне и самому интересно, какой из этих вариантов эффективнее, только сейчас не могу проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2008, 10:59 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=35315144&tid=2162283]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 251ms |
| total: | 424ms |

| 0 / 0 |
