Как стать автором
Обновить

Комментарии 11

Ну не бывает в жизни «таблеток от всего», как и самоходных машин, одинаково хорошо ездящих, плавающих и летающих. В компьютерном мире кажущаяся простота использования готовых решений работает лишь постольку, поскольку существует и популяризируется чудовищная аппаратная избыточность для решения «обычного» класса задач. Как только вы подходите к чему-то, более-менее требовательному по одному из типов ресурсов (памяти, ЦП, I/O) — конечность производительности аппаратуры сразу чувствуется, а результат «копания чуть глубже» — показывает масштаб издержек, которыми заплачено за внешнюю простоту.

PS — я писал подобный логгер, который видя в БД BLOB-типы, выплевывал в лог что-то типа substring(X, 1, 256), чтобы не зафлуживать лог, и только будучи сконфигурированным на отдачу полного блоба (для детальной отладки), отдавал весь. И в БД-методы, которые отдают блобы, всегда добавляю параметр, типа InfoOnly, получив который, процедура не тянет из базы блоб, а для совместимости по резалтсету выдает convert(varchar(max), NULL) — так как часто достаточно получить метаданные (имя файла, размер, пользователя, контрольную сумму массива), без вытаскивания самого блоба с пластин диска
И в БД-методы, которые отдают блобы, всегда добавляю параметр, типа InfoOnly, получив который, процедура не тянет из базы блоб, а для совместимости по резалтсету выдает convert(varchar(max), NULL) — так как часто достаточно получить метаданные (имя файла, размер, пользователя, контрольную сумму массива), без вытаскивания самого блоба с пластин диска

Любопытный подход, у вас СУБД "Оракл"?

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

Спасибо, возьму на вооружение!

Воистину, JProfiler друг наш и мудрый наставник. Иногда такие неочевидности делает очевидными, что на 10 статей хватит :) Особенно на копиях данных с продакшенов.
Вот тоже, буквально на днях обнаружил с его помощью цепочку toArray->asList->toArray и так далее.

Все профилировщики — наши друзья ;)

Я для таких случаев написал свой ByteStream. Пока размер буфера не превышает определенного порога, все пишется в byte[]. Как только данные выходят за эти пределы, то они сбрасываются во временный файл. Соответственно, метод getInputStream() в 1-м случае вернет ByteArrayInputStream, во 2-м — FileInputStream, обернутый в BufferedInputStream.

то они сбрасываются во временный файл

Не тормозит ли запись на диск?

Смотря с чем сравнивать. По сравнению с тем, как начинает тормозить вся JVM, когда не может найти непрерывную область памяти нужного размера, запись на диск просто летает. Потом, можно же эти файлы на каком-нибудь SSD или даже RAM-диске разместить.

По сравнению с тем, как начинает тормозить вся JVM, когда не может найти непрерывную область памяти нужного размера, запись на диск просто летает.

Согласен.


Потом, можно же эти файлы на каком-нибудь SSD или даже RAM-диске разместить.

А пробовали вместо файлов вне кучи память выделять? Например, писать байты в какой-нибудь direct ByteBuffer?

Не пробовал. Надо будет посмотреть на досуге, что это вообще за штука. До сих пор как-то не приходилось использовать.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации