Как я могу ограничить использование памяти при создании CSV из большого набора результатов? - PullRequest
0 голосов
/ 25 августа 2010

У меня есть веб-приложение в Spring, у которого есть функциональное требование для создания электронной таблицы CSV / Excel из набора результатов, поступающего из большой базы данных Oracle.Ожидаемые строки находятся в диапазоне 300 000 - 1 000 000.Время обработки - не такая большая проблема, как поддержание стабильности приложения - и сейчас очень большие наборы результатов приводят к нехватке памяти и сбоям.

В обычной ситуации, подобной этой, я хотел быиспользуйте нумерацию страниц и отображайте в интерфейсе ограниченное количество результатов одновременно.Однако в этом случае мне нужно иметь возможность создать весь набор в одном файле, независимо от его размера, для автономного использования.

Я выделил проблему для ParameterizedRowMapper, используемого для преобразованиярезультат разбит на объекты, где я застрял.

Какие приемы я смогу использовать, чтобы получить контроль над этой операцией?Пагинация еще вариант?

Ответы [ 4 ]

1 голос
/ 25 августа 2010

Вместо загрузки всего файла в память вы можете обрабатывать каждую строку отдельно и использовать выходной поток для отправки вывода непосредственно в веб-браузер.Например, в API сервлетов вы можете получить выходной поток из ServletResponse.getOutputStream (), а затем просто записать результирующие CSV-строки в этот поток.

1 голос
/ 25 августа 2010

Простой ответ:

Используйте набор записей JDBC (или что-то подобное, с соответствующим размером массива / выборки) и запишите данные обратно в большой объект, либо временный, либо обратно в базу данных.

Другой выбор:

Используйте PL / SQL в базе данных, чтобы записать файл, используя UTL_FILE для набора записей в формате CSV. Поскольку файл будет на сервере базы данных, а не на клиенте, используйте UTL_SMTP или JavaMail с помощью хранимых процедур Java для отправки файла по почте. В конце концов, я был бы удивлен, если бы кто-то собирался смотреть, как песочные часы переворачиваются несколько раз, ожидая, когда будет сгенерирован набор записей в 1 миллион строк.

0 голосов
/ 25 августа 2010

Рассматривали ли вы производительность электронной таблицы Excel с 1 000 000 строк?

0 голосов
/ 25 августа 2010

Я бы отодвинул эти требования - они звучат довольно искусственно. Что произойдет, если ваше приложение выйдет из строя или питание отключится до того, как пользователь просмотрит эти данные?

Из вышеприведенного комментария звучит так, будто вы знаете ответ - для работы вам нужен доступ к файловой системе или оракулу.

Вас просят сгенерировать некоторые данные - что-то, что не повторяется в sql? Если бы это можно было повторить, вы бы просто отправляли страницы данных пользователю за раз.

Поскольку этот отчет, я предполагаю, как-то связан с текущим состоянием ваших данных, вам нужно где-то сохранить этот результат, если вы не можете передать его пользователю. Я бы написал хранимую процедуру в Oracle - гораздо быстрее не отправлять данные туда и обратно по сети. Если у вас есть специальные инструменты или это просто, звучит так, будто нет ничего плохого в том, чтобы делать это на стороне Java.

Можете ли вы запланировать запуск этого отчета раз в неделю?

...