|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Есть задача реализовать средствами Oracle автоматическое построение произвольного отчёта с сохранением его в Excel-файл. Написал хранимую процедуру, которая получает в качестве параметра текст SQL-запроса, строит его и сохраняет результат в переменную типа TABLE of CLOB: каждый элемент - строка, значения колонок разделены символом "~". Затем эта переменная передаётся в Java-процедуру, которая должна поместить данные в заранее созданный Excel-файл. При тестировании процедуры на запросе, возвращающем около 70 тысяч строк, оказалось, что весь процесс занял примерно 12 часов, из которых собственно выполнение SQL-запроса занимало меньше 20 минут. Подскажите, пожалуйста, есть ли какой-нибудь способ ускорить формирование Excel-файла? Текст Java-кода: Код: java 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2016, 10:44 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
IMHO принципиально ускорить: XML (как текст или SAX) или CSV Если бы ты через OLE Automation в Excel заталкивал, подозреваю было бы еще медленнее. Не принципиально: 1. Вынести весь это бардак с сервера БД. На месте админов, я бы за такое убивал 2. Разбираться с настройками памяти Java машины, но во встроенной в СУБД JVM - это будет совсем не тривиально, а может даже и почти не возможно ( "там automatic memory management, Oracle умный, сам знает как лучше" ( C ) админ по поводу настройки памяти в Oracle) 3. Профилировать и разбираться что тормозит IMHO. С POI работал очень давно, лет 10-15 назад ))). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2016, 12:18 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Warlock86, Посмотрите https://poi.apache.org/spreadsheet/how-to.html#sxssf Вы посимвольно сканируете строку на нахождение символа "~", вместо того, что бы сразу разбить её на подстроки - см. split И вообще с массивом строк, мне кажется, не лучшая идея. Сначала вы набор данных загоняете в массив, потом вытаскиваете всё обратно. Непосредственно с набором данных работать не пробовали? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2016, 13:01 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Warlock86, 1. Обязательно открывать и читать старый файл? Может создавать новый лучше. 2. Я бы использовал Reader Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
3. Последний символ не обрабатывается while(ch<l) <- ch<=l ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2016, 13:03 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Garrick , попробовал сделать так, как указано по ссылке. Возвращает ошибку ORA-29532: Java call terminated by uncaught Java exception: java.lang.SecurityException: Unable to create temporary file. Добавил в код эту строчку: Код: java 1.
ничего не изменилось. Как определить, где программа пытается создать временный файл? Или как изменить этот каталог? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2016, 16:32 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
[quot Warlock86] Garrick , попробовал сделать так, как указано по ссылке. Возвращает ошибку ORA-29532: Java call terminated by uncaught Java exception: java.lang.SecurityException: Unable to create temporary file. Добавил в код эту строчку: Код: java 1.
ничего не изменилось. Временный файл создаётся в каталоге предусотренным для этого операционной системой. Проблема не в наличии каталога и прав доступа к нему, а в грантах текущего пользователя внутри Oracle. см. http://citforum.ru/database/oracle/kyte/19.shtml там есть примеры раздачи прав через процедуру GRANT_PERMISSION в пакете DBMS_JAVA ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2016, 09:40 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Warlock86Как определить, где программа пытается создать временный файл? Или как изменить этот каталог? Извиняюсь, как-то криво цитата вставилась. Жалко редактировать нельзя. Итак... Временный файл создаётся в каталоге предусотренным для этого операционной системой. Проблема не в наличии каталога и прав доступа к нему, а в грантах текущего пользователя внутри Oracle. см. http://citforum.ru/database/oracle/kyte/19.shtml там есть примеры раздачи прав через процедуру GRANT_PERMISSION в пакете DBMS_JAVA ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2016, 09:44 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Garrick , как давать пользователю права на чтение/запись файлов через DBMS_JAVA я знаю. Вопрос в том, что за папка используется для временных файлов (Windows Server 2008 R2 Standard x64)? Попробовал Код: java 1.
- не помогло. После Код: java 1.
заработало, но мне кажется, неправильно давать пользователю право на запись во все папки диска C. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2016, 10:57 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Немного некорректно выразился в предыдущем сообщении. Неправильно запустил процедуру, потому она и завершилась без ошибок (проблемный Java-код просто не запустился :-) ). При повторном запуске была уже ошибка на то, что у пользователя нет прав на удаление файлов и вот там уже был указан полный путь к директории. Выполнил следующие строчки: Код: plsql 1. 2. 3. 4.
где USER1 - имя пользователя, и всё заработало. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2016, 11:11 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Апну тему, т.к. проблема, точнее говоря задача у меня схожая. Формирую xlsx файлы с использованием XSSFWorkbook и скорость, которую выдает POI не очень радует, например, формирование таблицы 25 колонок * 100 строк, данные для которой уже профетчены из БД и уже закэшированы в рамках Java'овского процесса, занимает порядка 30 секунд. А бывает, что нужно сформировать файл тысячи, десятки тысяч строк и получается, такие файлы формируются уже десятками минут, при этом свободных аппаратных ресурсов навалом (куча свободных ядер, памяти). Вот думаю, можно ли, как-нибудь распараллелить формирование файла, тем самым сократить время формирования файла, повысить утилизацию ресурсов? ЗЫ: пытался гуглить на тему ThreadSafe у POI, но ничего внятного не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2016, 20:57 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
just_vladimirдесятки тысяч строк в excell? Уверены? Бумаги не жалко? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2016, 21:37 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Petro123just_vladimirдесятки тысяч строк в excell? Уверены? Бумаги не жалко? Уверен абсолютно, про бумагу не осилил. Есть соображения, как можно повысить скорость формирования? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2016, 21:42 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
just_vladimir, На такой объём нужен СЕРВЕР печати. Или JasperReport но не POI. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2016, 22:01 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Petro123, сервер печати? Вы о чем, стало еще непонятней... А в JasperReport раньше вроде тоже POI использовался, что то изменилось? За счет чего он будет быстрее? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2016, 22:04 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
just_vladimirЗа счет чего он будет быстрее? - его можно посадить вообще на отдельную машину. - у него обычный запрос к БД который можно отладить и оттюнить в любой БД, а потом записать в Jasper. Где тут будет тормозить - выясняйте. Если вы не ТС, то по новой описывайте проблему и что пытались делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2016, 22:21 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Petro123just_vladimirЗа счет чего он будет быстрее? - его можно посадить вообще на отдельную машину. - у него обычный запрос к БД который можно отладить и оттюнить в любой БД, а потом записать в Jasper. Где тут будет тормозить - выясняйте. Если вы не ТС, то по новой описывайте проблему и что пытались делать. Я не ТС, особого смысла в размножении тем не вижу, свою проблему описал в этом посте: авторФормирую xlsx файлы с использованием XSSFWorkbook и скорость, которую выдает POI не очень радует, например, формирование таблицы 25 колонок * 100 строк, данные для которой уже профетчены из БД и уже закэшированы в рамках Java'овского процесса, занимает порядка 30 секунд. А бывает, что нужно сформировать файл тысячи, десятки тысяч строк и получается, такие файлы формируются уже десятками минут, при этом свободных аппаратных ресурсов навалом (куча свободных ядер, памяти). Вот думаю, можно ли, как-нибудь распараллелить формирование файла, тем самым сократить время формирования файла, повысить утилизацию ресурсов? ЗЫ: пытался гуглить на тему ThreadSafe у POI, но ничего внятного не нашел. Хотя если администрация форума считает, что нужна отдельная, то без проблем создам. У меня отдельно сервер БД, отдельно сервер с Java приложением, проблем с запросом у меня нет и измеряю время затрачиваемое исключительно на формирование xlsx (все нужные данные уже внутри Java'овской коллекции) и, к сожалению, это время далеко от идеала. Есть конечно же вариант вспомнить, что xlsx это всего лишь zip'ованный xml, который можно сгенерировать каким-нибудь шаблонным движком и вероятно будет приемлемо быстро, но вдруг все таки POI предлагает какие нибудь красивые возможности по быстрому формированию файлов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2016, 22:37 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
just_vladimirэто время далеко от идеала. - поиск делал? Тут хотя бы цифры времени есть О выгрузке в excel - есть ветка форума отдельно для таких больших (странных) отчётов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2016, 23:10 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
У Excel достаточно простой XML формат. Выгрузить свои данные в XML, создать XSL файл, натравить на исходный XML какой нибудь XSL-транформер (Xalan/Xerces), открыть в Excel. Профит. Главное DOM не использовать и будет так быстро, как только возможно. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2016, 14:22 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Leonid KudriavtsevВыгрузить свои данные в XML, создать XSL файл, натравить на исходный XML какой нибудь XSL-транформер (Xalan/Xerces), открыть в Excel. Профит. Неправильное решение. Если нужно сделать отчёт "средствами Oracle", то такие средства есть - генераторы отчётов Oracle Reports (устаревший, но всё ещё годный) и новый Oracle BI Publisher. Даже если их не использовать, то это решение лишено смысла, т.к. POI работает очень быстро и расходует мало памяти при правильном использовании (что я сам испытывал). Приведённый пример расходует много памяти, что показывает, что автор не потрудился изучить POI. Почему он работает медленно - заочно сказать трудно, надо смотреть, где торможение. Если памяти не хватает из-за её большого расхода, то будет тормозить. Но возможны другие причины. Но мне бы и в голову не пришло делать для этого хранимые процедуры в Oracle, т.к. они предназначены для расширения возможностей PL/SQL, чего тут не наблюдается. Можно попробовать оформить этот код в виде клиентского приложения, чтобы сравнить скорость. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2016, 14:53 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Partisan MЕсли нужно сделать отчёт "средствами Oracle", то такие средства есть - генераторы отчётов Oracle Reports (устаревший, но всё ещё годный) и новый Oracle BI Publisher. + На проектах все на BI Publisher'е делали. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2016, 14:56 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
+ за BI ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2016, 18:05 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
just_vladimir, Есть подозрение, что POI тут ни при чём. Попробуйте выгрузить ваши данные используя тот же самый алгоритм формирования "ячеек", например в CSV-файл. Сильно ли увеличится скорость формирования файла по сравнению с POI? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2016, 09:22 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
Garrick, судя по всему дело в автоподгоноке ширины колонок, думаю для больших выгрузок откажусь от этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2016, 17:52 |
|
Java + Apache POI. Очень долго формируется Excel-документ
|
|||
---|---|---|---|
#18+
just_vladimirGarrick, судя по всему дело в автоподгоноке ширины колонок, думаю для больших выгрузок откажусь от этого. Я в процессе дабавления ячеек запоминаю максимальную длину строк в столбцах, а по окончании формирования всей таблицы устанавливаю ширину столбцов по этим значениям. Можно посмотреть здесь . ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 09:54 |
|
|
start [/forum/topic.php?fid=59&fpage=31&tid=2121424]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
95ms |
get tp. blocked users: |
2ms |
others: | 351ms |
total: | 518ms |
0 / 0 |