Я ищу способ эффективного поиска данных в огромной многомерной матрице.
Мое приложение содержит данные, которые характеризуются несколькими измерениями. Представьте себе, что вы храните данные обо всех продажах в компании (мое приложение совершенно другое, но это только для того, чтобы продемонстрировать проблему). Каждая продажа характеризуется:
- продукт, который продается
- клиент, купивший товар
- день, в который он был продан
- сотрудник, который продал продукт
- способ оплаты
- проданное количество
У меня миллионы продаж за тысячи продуктов сотнями сотрудников за много дней.
Мне нужен быстрый способ расчета, например ::1010 *
- общее количество, проданное сотрудником за определенный день
- общее количество, купленное клиентом
- общее количество товара, оплаченного кредитной картой
- ...
Мне нужно хранить данные самым подробным образом, и я мог бы использовать карту, где ключ - это сумма всех измерений, например:
class Combination
{
Product *product;
Customer *customer;
Day *day;
Employee *employee;
Payment *payment;
};
std::map<Combination,quantity> data;
Но так как я заранее не знаю, какие запросы выполняются, мне нужно несколько классов комбинации (где элементы данных находятся в разном порядке) или карты с разными функциями сравнения (с использованием другой последовательности для сортировки).
Возможно, проблему можно было бы упростить, указав каждому продукту, клиенту ... номер вместо указателя на него, но даже тогда у меня останется много памяти.
Существуют ли какие-либо структуры данных, которые могут помочь в эффективном поиске такого рода?
EDIT:
Просто для пояснения некоторых вещей: На диске мои данные хранятся в базе данных, поэтому я не ищу способы изменить это.
Проблема в том, что для выполнения моих сложных математических вычислений у меня есть все эти данные в памяти, и мне нужен эффективный способ поиска этих данных в памяти.
Может ли база данных в памяти помочь? Возможно, но я боюсь, что база данных в памяти может серьезно повлиять на потребление памяти и производительность, поэтому я ищу более подходящие альтернативы.
РЕДАКТИРОВАТЬ (2):
Еще несколько уточнений: мое приложение будет выполнять моделирование данных, и в итоге пользователь может свободно сохранять эти данные или нет в моей базе данных. Так что сами данные все время меняются. Во время выполнения этих симуляций и изменения данных мне нужно запросить данные, как описано выше.
Опять же, просто запросить базу данных не вариант. Мне действительно нужны (сложные?) Структуры данных в памяти.