Структура данных для хранения произвольных таблиц базы данных - PullRequest
6 голосов
/ 06 августа 2010

Я хотел бы спроектировать структуру данных JVM (Java / Scala), которая может использоваться для представления и хранения содержимого произвольных таблиц реляционной базы данных.Структура данных должна быть быстрой (не слишком интенсивной для gc, кеш-ориентированной) и эффективной для использования памяти, поэтому в ОЗУ могут помещаться таблицы большего размера.

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

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

Другое решение состоит в размещении данных каждой строки в байтовый массив так же, как реальные базы данных сериализуют свои строки, используя только столько байтов, сколько необходимо.Это удобно для кеша и памяти, но меня беспокоит стоимость сериализации / десериализации при каждом доступе.

Какой самый лучший способ?

Ответы [ 3 ]

1 голос
/ 19 сентября 2010

Четвертым решением было бы хранить данные каждой строки в виде строк вместо байтовых массивов. Это может избежать затрат на сериализацию в большинстве случаев - при условии, что большинство данных будут строками.

Это также будет легче отлаживать и будет независимым от платформы. Конечно, у него есть некоторые ограничения: например, float не может быть представлен как есть, но может храниться в чем-то похожем на формат DECIMAL SQL.

Любое решение будет компромиссом.

EDIT Однако я бы предпочел решение с байтовым массивом для вашего случая: один байтовый массив на строку. Это должно быть максимально удобным для кэша для строк фиксированного размера. Но тогда вы должны также предоставить решение для строк переменного размера. Низкоуровневый язык лучше подходит для этой задачи: в Си можно определить два формата: строки фиксированного размера, в которых метаданные таблицы содержат смещения столбцов (например, столбец 1: байты 0..31, столбец 2: байты 32..127 и т. д.) и второй формат строки переменного размера, где строки сами содержат размеры столбцов (например, байты 1..3 содержат размер, следующее количество байтов содержит данные, затем еще 4 байта содержат размер, следующие данные и так далее).

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

Почему бы не использовать hsqldb или h2 ?

Они оба поддерживают режим в памяти и являются чистой Java. Они заставляют вас использовать SQL для доступа, но, с другой стороны, вам не нужно реализовывать собственное объединение.

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

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

Какова цель сделать это?Скорее всего, вам лучше просто хранить данные, которые вы извлекаете из своей базы данных (как объекты, с которыми вы их отображаете), в каком-либо слое кэширования, таком как EhCache, OSCache, memcache и т. Д., - а не заново изобретать колесо.

...