Эффективный поиск в огромной многомерной матрице - PullRequest
0 голосов
/ 13 февраля 2012

Я ищу способ эффективного поиска данных в огромной многомерной матрице.

Мое приложение содержит данные, которые характеризуются несколькими измерениями. Представьте себе, что вы храните данные обо всех продажах в компании (мое приложение совершенно другое, но это только для того, чтобы продемонстрировать проблему). Каждая продажа характеризуется:

  • продукт, который продается
  • клиент, купивший товар
  • день, в который он был продан
  • сотрудник, который продал продукт
  • способ оплаты
  • проданное количество

У меня миллионы продаж за тысячи продуктов сотнями сотрудников за много дней.

Мне нужен быстрый способ расчета, например ::1010 *

  • общее количество, проданное сотрудником за определенный день
  • общее количество, купленное клиентом
  • общее количество товара, оплаченного кредитной картой
  • ...

Мне нужно хранить данные самым подробным образом, и я мог бы использовать карту, где ключ - это сумма всех измерений, например:

class Combination
   {
   Product *product;
   Customer *customer;
   Day *day;
   Employee *employee;
   Payment *payment;
   };

std::map<Combination,quantity> data;

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

Возможно, проблему можно было бы упростить, указав каждому продукту, клиенту ... номер вместо указателя на него, но даже тогда у меня останется много памяти.

Существуют ли какие-либо структуры данных, которые могут помочь в эффективном поиске такого рода?

EDIT:

Просто для пояснения некоторых вещей: На диске мои данные хранятся в базе данных, поэтому я не ищу способы изменить это.

Проблема в том, что для выполнения моих сложных математических вычислений у меня есть все эти данные в памяти, и мне нужен эффективный способ поиска этих данных в памяти.

Может ли база данных в памяти помочь? Возможно, но я боюсь, что база данных в памяти может серьезно повлиять на потребление памяти и производительность, поэтому я ищу более подходящие альтернативы.

РЕДАКТИРОВАТЬ (2):

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

Опять же, просто запросить базу данных не вариант. Мне действительно нужны (сложные?) Структуры данных в памяти.

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

РЕДАКТИРОВАТЬ : заменить предыдущий ответ.

Можете ли вы представить, что у вас есть какой-то другой возможный выбор, кроме запуска qsort () для этого гигантского массива структур?Там просто нет другого пути, который я могу видеть.Может быть, вы можете отсортировать его только один раз в нулевой момент времени и сохранить сортировку, как при динамическом добавлении / удалении записей.

0 голосов
/ 13 февраля 2012

Использование базы данных (в памяти или нет) для работы с вашими данными кажется правильным способом сделать это.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...