|
|
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
Спасибо, жаль, что код довольно труден для понимания... Число листов, строк и колонок у меня может быть любое, в частности для той таблицы из 20000 ячеек колонок около 35. Но проблема еще и в быстром считывании данных при посылке на сервер - нужно считать значения и примечания для 20000 ячеек. Здесь Recordset может помочь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2010, 18:00 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayСпасибо, жаль, что код довольно труден для понимания... Число листов, строк и колонок у меня может быть любое, в частности для той таблицы из 20000 ячеек колонок около 35. Но проблема еще и в быстром считывании данных при посылке на сервер - нужно считать значения и примечания для 20000 ячеек. Здесь Recordset может помочь? Для примечаний, как я понимаю - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2010, 19:29 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayНо проблема еще и в быстром считывании данных при посылке на сервер - нужно считать значения и примечания для 20000 ячеек. Можешь выложить исходные полные файлы? А то и потестить не с чем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2010, 20:03 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
AntonariyAndrFЕму примечания нужны, а как их запихнуть в чистый XML мне не ведомо...Так ить "Сохранить как — Таблица XML"… Имеем результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. А можешь подсказать, какая у этого файла кодировка? То бишь сконвертить для него строку... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2010, 20:34 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
AndrF Можешь выложить исходные полные файлы? А то и потестить не с чем... Конкретно файл с макросами не могу, а потестировать можете примерно как я - заполняю таблицу примерно 1600 строк*13 колонок автозаполнением - можно одинаковые числа и примечания сделать. И нужно чтобы из этого формировалась строка вида Лист|B|2|1`Лист|C|2|1`Лист|D|2|1`... и т.п. Из примечаний тоже чтобы значения доставались в таком же виде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2010, 20:52 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
AndrFА можешь подсказать, какая у этого файла кодировка? То бишь сконвертить для него строку...Генерировать можно win-1251, но эксель пересохраняет в utf-8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2010, 23:23 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
Приложен пример с созданием и заполнением из кода xml-файла с примечаниями ячеек. Раскраску не делал, но оно тоже примитивно и на скорость существенно не повлияет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 00:20 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
Спасибо, тоже может пригодиться. Я потестил обновленные процедуры считывания данных и помещения их в строку (переменную) и парсинг строки и обновление таблицы. Сейчас уже получается так: получилось ускорить обновление таблицы, т.е. запись, а вот основное время занимает считывание - для такой таблицы (около 19000 ячеек) оно занимает 2 мин 30 сек примерно. Но вроде бы считывание данных обычно быстрее должно быть, чем запись, почему же так? Вот код для считывания данных и помещения их в строку для отправки на сервер: Код: 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. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 00:47 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorway, Попробуйте для эксперимента собирать данные не в текстовую строку, а выводить в файл на диске. Сравните время. Попробуйте для эксперимента не накапливать данные в переменной, а просто перезаписывать ее поверх (чтобы длина переменной не росла). Сравните время. У меня есть опыт - я формировал отчет (под VB6) примерно 3000-4000 строк и около 12-ти столбцов. В основном числовые данные и пара строковых. Пользователю предлагался выбор, сформировать его в памяти и последующая передача в буфер обмена для вставки в эксель, либо сразу отправлять в базу (прямо по мере формирования). Так вот, отправка в базу на сервер в сети, выполняется В РАЗЫ быстрее, чем сбор отчета в текстовую переменную. Видимо, тут играют роль принципы выделения памяти под постоянно растущую переменную. Если эксперименты дадут положительные результаты, можно будет подумать, как это обойти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 01:04 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayдля такой таблицы (около 19000 ячеек) оно занимает 2 мин 30 сек примерно. Прогнал свой примерчик на скорость со своим тестовым файлом - 3 листа 20x2000 =120000 ячеек с примечаниями заполняются ~3 минуты... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 01:20 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
Shocker.Promotorway, Попробуйте для эксперимента собирать данные не в текстовую строку, а выводить в файл на диске. Сравните время. Попробуйте для эксперимента не накапливать данные в переменной, а просто перезаписывать ее поверх (чтобы длина переменной не росла). Сравните время. У меня есть опыт - я формировал отчет (под VB6) примерно 3000-4000 строк и около 12-ти столбцов. В основном числовые данные и пара строковых. Пользователю предлагался выбор, сформировать его в памяти и последующая передача в буфер обмена для вставки в эксель, либо сразу отправлять в базу (прямо по мере формирования). Так вот, отправка в базу на сервер в сети, выполняется В РАЗЫ быстрее, чем сбор отчета в текстовую переменную. Видимо, тут играют роль принципы выделения памяти под постоянно растущую переменную. Если эксперименты дадут положительные результаты, можно будет подумать, как это обойти. Я об этом недавно подумал. Только как сделать, чтобы длина не росла - ведь на каждой итерации длина общая увеличивается. Или вы имеете в виду добавлять в конец файла (append)? Насчет памяти тоже были мысли, что это из-за этого. Нужно бы успеть всё это проверить побыстрее, а то при сохранении на винчестер в последнее время стали раздаваться звуки, похожие на метеоритный дождь (или тормоза). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 01:27 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
AndrFmotorwayдля такой таблицы (около 19000 ячеек) оно занимает 2 мин 30 сек примерно. Прогнал свой примерчик на скорость со своим тестовым файлом - 3 листа 20x2000 =120000 ячеек с примечаниями заполняются ~3 минуты... А какой у вас комп? У меня в таблице в каждой ячейке были небольшие числа и у каждой по примечанию не длинному. Всего 18967 ячеек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 01:29 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
Кстати, можно ли как-то в VBA распараллелить обработку? Если у компьютера 2 ядра, это должно помочь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 01:30 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayЯ об этом недавно подумал. Только как сделать, чтобы длина не росла - ведь на каждой итерации длина общая увеличивается. Или вы имеете в виду добавлять в конец файла (append)? Я имел ввиду два разных теста. Вывод в файл на диске - да, просто не закрывая файл принтить туда данные по мере поступления. Потом пришла в голову мысль - просто замените Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 01:33 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayКстати, можно ли как-то в VBA распараллелить обработку? Если у компьютера 2 ядра, это должно помочь На одной копии экселя наверное не получится. То есть надо, видимо, запускать второй эксель, раздать двум задачам данные напополам и запустить асинхронно. Только гемора по-моему с этим будет гораздо больше, чем выгоды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 01:35 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayА какой у вас комп? У меня в таблице в каждой ячейке были небольшие числа и у каждой по примечанию не длинному. Всего 18967 ячеек Athlon X2 5600+, 4 Gb, Windows-7 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 02:18 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayА какой у вас комп? У меня в таблице в каждой ячейке были небольшие числа и у каждой по примечанию не длинному. Всего 18967 ячеек Athlon X2 5600+, 4 Gb, Windows-7 В приложенном файле в модуле modTest вначале запустить процедуру CreateTestFile - сформируется тестовый файл с данными. И только потом запускать собственно программу.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 02:24 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayНо вроде бы считывание данных обычно быстрее должно быть, чем запись, почему же так? Потому что считывание не виновато, виноват известный VB-баг, тормозная конкатенации строк. Возьмите исходник класса StringBuilder, который есть в примере AndrF , скопируйте в эксель-класс и используйте вместо values = values + Скорость увеличится на пару порядков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 11:28 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
Antonariyвиноват известный VB-баг, тормозная конкатенации строк. Я, в-общем, о том же... на личном опыте получается... А что за известный баг, я чего-то о нем ничего не слышал? Или ты его уже полностью описал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 12:12 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
Описал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 12:57 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
Хотелось бы, конечно, сделать на чистом VBA, т.к. в том коде я не очень разбираюсь... И как дописывать в файл строку? С файлами из VBA тоже редко работал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 15:16 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 15:44 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayИ как дописывать в файл строку? С файлами из VBA тоже редко работал. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 15:51 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
motorwayХотелось бы, конечно, сделать на чистом VBA, т.к. в том коде я не очень разбираюсь... И как дописывать в файл строку? С файлами из VBA тоже редко работал. Это не совершенно баг, а просто для каждого объединения строк VB приходится перераспределять память, а чем больше строки участвующие в объединении тем дольше это происходит. Это совершенно не зависит от языка разработки - везде так. Потому для ускорения объединения вначале резервируют место под большую строку и просто вставляют туда добавляемые строчки. Примерно так и работает StringBuilder - в NET так же есть аналогичный класс.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 17:02 |
|
||
|
Долгая обработка текстовых данных в Экселе
|
|||
|---|---|---|---|
|
#18+
AndrFЭто не совершенно баг, а просто для каждого объединения строк VB приходится перераспределять память, а чем больше строки участвующие в объединении тем дольше это происходит. Это совершенно не зависит от языка разработки - везде так. Потому для ускорения объединения вначале резервируют место под большую строку и просто вставляют туда добавляемые строчки. Примерно так и работает StringBuilder - в NET так же есть аналогичный класс.... Я так думаю, чтоб если бы ядро не пыталось каждый выделить непрерывный кусок памяти под это дело, а использовало разумную фрагментацию, то работало бы это быстрее. Так что относительно - все-таки баг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2010, 17:06 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=36558072&tid=2159730]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 379ms |

| 0 / 0 |
