Существует матрица характеристик продукта. Он имеет тысячи рядов (продуктов) и сотни функций. Он имеет двоичные значения, которые показывают, есть ли у продукта эта функция или нет. Таким образом, это может быть таблица из 40 000 строк и 900 столбцов.Улучшение производительности агрегирования и поиска матриц/таблиц
Product-feature matrix
pr f1 f2 f3 fn ...
01 0 1 1 1
02 0 0 0 0
03 1 0 1 0
04 1 0 1 0
.....
Во-первых, я должен найти продукты, которые имеют определенный набор функций Q. Э.Г. Q = (f1 = 1, f5 = 1, f27 = 1). Простые сказали, найдите синие автомобили, хэтчбек, 3-дверные.
Result 1
Given Q=(f1=1, f5=1, f27=1)
Relevant products: 03, 04, 08...
Во-вторых, и самое главное, я должен найти, сколько продуктов, которые имеют множество функций Q, также есть функция F_i (где я - 1..n). Другими словами, мы выбираем строки, которые удовлетворяют Q, и подсчитывают, сколько 1 в каждом столбце (сделать агрегацию SUM). Например. сколько синих автомобилей, хэтчбек, 3-дверный также имеет: дизельный двигатель, бензиновый двигатель, ксеноновые фары.
Result 2
Given Q=(f1=1, f5=1, f27=1)
sum f2 = 943
sum f3 = 543
sum f4 = 7
sum f6 = 432
....
Конечно, можно решить эту задачу с помощью РСУБД, но это не так эффективно - в общем случае это потребует FullScan как для поиска продуктов и агрегации в каждом столбцах. По крайней мере, я не знаю, как создать эффективный индекс дерева b для этой задачи. Oracle bitmap index может помочь, но я не могу использовать Oracle.
В настоящее время мы используем MySQL для выполнения этой задачи, но это не показывает хороших результатов. На самом деле мы используем целочисленное представление (мы группируем функции и сохраняем целые числа в столбцах, а не в значениях bool), чтобы уменьшить количество столбцов.
Можно рассматривать эту матрицу как разреженную двоичную матрицу. И это не большая проблема, чтобы сохранить его полностью в памяти. И мне интересно, можно ли применить некоторые алгоритмы для работы с разреженными матрицами, векторным пространством (SVD, умножением матричных векторов и т. Д.). Но это, вероятно, помогает найти продукты, удовлетворяющие вектору Q, а не в агрегации. Проблема заключается скорее во времени агрегации, а не в пространстве.
Возможно, можно хранить матрицу как многосвязный список, который поможет найти продукты и сделать агрегацию для каждого столбца.
Наконец, вопрос заключается в том, как лечить эту задачу. Каков наиболее эффективный алгоритм для поиска продуктов с заданными функциями, а затем подсчет продуктов с дополнительными функциями (совокупность по каждому столбцу).
Таким образом, у вас есть отдельное двоичное поле для каждого цвета ?????? – symcbean
symcbean, цвет только для примера - для иллюстрации задачи. Особенности могут иметь совсем другой характер. Как я уже упоминал, можно уменьшить количество столбцов, объединив некоторые функции и сделав их идентификатор в группе uniq. Таким образом, они становятся значениями int, а не двоичными. В каждом столбце будет храниться определенная группа функций. Это позволяет нам иметь только 50 столбцов. Но в любом случае, агрегация даже в 50 столбцах не такая быстрая. – Andre