Как сохранить разреженную запрашиваемую матрицу на диске или в базе данных?

Мне нужно хранить разреженную матрицу на диске. Это похоже на таблицу базы данных с миллионами строк и тысячами столбцов, где многие или большинство столбцов имеют значение NULL. Он должен быть доступным для запросов, как SQL SELECT с WHERE в некоторых столбцах.

Мое конкретное требование относится к Java. Сначала я подумал об использовании Berkeley DB для Java для моделирования таблицы, но потом он не поддерживает запросы на основе значений.

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

Любые идеи?

Ответов (5)

Решение

Первое, что пришло мне в голову при чтении заголовка вопроса, это строка базы данных на (x, y), как вы предложили в предпоследнем абзаце.

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

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

Если вы можете делать все с помощью последовательной обработки (например, сканирование в порядке строк), то простой файл будет еще одним разумным вариантом для рассмотрения.

Если вам нужно только сохранить данные, как вы говорите «на диске», прочитать их и выполнить определенные запросы, вы можете рассмотреть возможность простой сериализации класса по вашему выбору. Устраняет всю необходимость в инфраструктуре базы данных, но, очевидно, также исключает многие вещи, в которых база данных действительно могла бы вам помочь,

база данных Intersystems Cache использует внутренние структуры для хранения данных, которые представляют собой разреженные многомерные массивы. Может, посмотри. Вы можете запросить его и сопоставить с таблицами SQL. Я не уверен, что вы можете напрямую получить доступ к многомерным массивам в Intersystems Cache из java.

Недавно я заинтересовался хранилищем типа ключ-значение и наткнулся на эту запись в блоге, описывающую, как FriendFeed использует MySQL для реализации аналогичного требования:

http://bret.appspot.com/entry/how-friendfeed-uses-mysql