Хранение больших матриц в Apache Ignite - PullRequest
0 голосов
/ 21 июня 2019

У меня есть большая матрица целых чисел, которую я хочу иметь возможность разрезать и запускать аналитику. Я создаю это с помощью Apache Ignite.

Матрица 50000 столбцов х 5 миллионов строк. Я хочу иметь возможность выполнять следующие операции над этой матрицей:

  1. Получить все данные для одного столбца
  2. Получить все данные для некоторого случайного подмножества строк и столбцов.
  3. Вычислить коэффициент корреляции для одной строки по отношению к каждой другой строке.

Я сейчас пытаюсь удовлетворить 1. и 2., но не могу понять, как хранить матрицу. Я думал о сохранении матрицы следующим образом:

row1 {
    co1: val
    co2: val
    co3: val
    ...
    co50000: val
}
row2{ ... }

Но я не уверен, что у меня могут быть сложные типы данных в Ignite, или у меня может быть только одна пара ключ: значение. Документация не ясна. Когда я пытаюсь вставить словарь с помощью pyignite (мой Java немного ржавый, поэтому я сейчас придерживаюсь python), данные возвращаются в виде массива:

>>> test.put('row2', { "col1": 50, "col2":0 })
>>> test.get('cell2')
['gene1', 'gene2']

Я новичок в Apache Ignite, но в документации, похоже, нет подробных сведений о том, как это сделать, или даже о том, что это будет производительным.

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Я думаю, что вам нужно хранить 5 миллионов пар KV, используя строку в качестве ключа и содержащую массив 50000 столбцов в качестве значения.

Лучше придерживаться примитивных типов.Не уверен, как лучше всего сопоставить его с Python.

0 голосов
/ 22 июня 2019

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

cache.get(row)[column] будет работать, но он получит всю строку из 50000 элементов из кэша в виде списка Python, а затем обратится к одному элементу в этом списке. Я думаю, что в вашем случае это будет неоптимальным.

Если я правильно понял ваш вопрос, JSON-ориентированные базы данных (например, MongoDB или PostgreSQL JSONB) имеют описанные вами функции. Не знаю, достаточно ли они быстры для анализа данных.

...