Почему заглядывать в BLOB через getBytes (long pos, int length) так медленно в базе данных H2? - PullRequest
1 голос
/ 05 февраля 2011

У меня есть приложение, которое должно заглядывать в большие двоичные объекты, получая небольшое количество байтов (через getBytes (long pos, int length)). Капли размером ~ 30 МБ. Когда я спрашиваю байты в начале большого двоичного объекта, производительность оказывается разумной. Когда я спрашиваю байты в конце большого двоичного объекта, производительность значительно ухудшается. Глядя на исходный код (JdbcBlob.java), кажется, что BLOB-объект читается последовательно, а не случайным образом (через поток ввода).

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 февраля 2011

Это медленно, потому что H2 использует InputStream и не делает произвольный доступ (так что вы уже ответили на вопрос самостоятельно). Причина, по которой произвольный доступ не поддерживается: пока никто не запрашивал эту функцию: -)

Я не думаю, что есть простой обходной путь. H2 необходимо изменить для поддержки произвольного доступа. Для данных BLOB это должно быть относительно легко; для данных CLOB это будет сложнее (поскольку данные хранятся в форме UTF-8, а поиск нужной точки не так прост).

Я сейчас добавил запрос функции в план, но если вам действительно понадобится эта функция в ближайшем будущем, то, боюсь, вам придется реализовать ее самостоятельно. H2 является открытым исходным кодом, и патчи всегда приветствуются: -)

0 голосов
/ 01 мая 2012

Я только что обновился до версии 1.3.166 и был рад обнаружить, что эта проблема была исправлена. Просмотр в конце блоба в моем случае занял около 500 мс.

Теперь это занимает 4 мс.

...