Внешнее хранилище для сложных коллекций, к которым может получить доступ Key-Value - PullRequest
0 голосов
/ 15 июня 2011

Проблема

Мне нужно хранилище значений ключей, которое может хранить значения следующей формы:

DS<DS<E>>

, где структура данных DS может быть List, SortedSet или Array

, а E может быть String или byte-array.

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

Пример приложения

A (возможно, плохой, но достаточный для прояснения) пример приложения хранит токенизированные предложения издокумент, в котором вам нужно иметь быстрый доступ к четвертому слову пятого предложения , указанному documentID.В этом случае я буду хранить его в виде пары KV следующим образом:

K - docID
V - List<List<String>>
String word = map.get(docID).get(p).get(q);

Я предпочитаю избегать интегрированных с приложениями решений Map (таких как EhCache в Java).

У меня естьработал с Redis, но он не поддерживает второй уровень сложности структуры данных.Любые другие решения KV, которые могут помочь моему варианту использования?


Обновление :

Я знаю, что могу сериализовать / десериализовать свой объект, но мне было интересно, есть лиесть другое решение.

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

С точки зрения выбора платформы у вас есть два варианта: полная база данных документов будет поддерживать произвольно сложные объекты, но не будет иметь встроенных команд для работы с конкретными структурами данных. Что-то вроде Redis, который имеет оптимизированный код для конкретных структур данных, не может поддерживать все возможные структуры данных.

На самом деле вы можете довольно близко познакомиться с Redis, используя идентификаторы вместо вложенной структуры данных. DS1<DS2<E>> становится DS1<int> и DS2<E>, с int от DS1 и префиксом, дающим вам ключ, удерживающий DS2.

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

1 голос
/ 15 июня 2011

Я не решаюсь "порекомендовать" его, но один из известных мне механизмов хранения, который эффективно обрабатывает многомерные данные такого рода, - Intersystems Cache . Я должен был использовать его на своей последней работе, в основном на кодировании с использованием встроенного языка MUMPS. Я бы не рекомендовал нативный подход, если вы не ненавидите себя или своих разработчиков. Тем не менее, у них есть приличные адаптеры Java, которые, похоже, и используются. Я видел, как он обрабатывает миллиарды записей, эффективно хранящихся во вложенных таблицах двоичного дерева. Нет практического ограничения на глубину (количество измерений), которую вы можете использовать. Тем не менее, это очень частное решение. Существует альтернатива с открытым исходным кодом, которая называется GT.M , но я не знаю, насколько она совместима с языками, не относящимися к M или C.

0 голосов
/ 15 июня 2011

Любое хранилище Key-Value поддерживает сложные значения, вам просто нужно сериализовать / десериализовать данные.

Если вы хотите быстрый поиск только для определенных частей данных, вы можете использовать более сложный ключ. В вашем примере это будет: K - кортеж (docID, p, q)

...