2012-02-13 2 views
0

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

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

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

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

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

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

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

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

std::map<Combination,quantity> data; 

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

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

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

EDIT:

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

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

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

EDIT (2):

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

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

+1

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

+0

MySQL (для примера БД) предназначен для выполнения этой точной работы самым быстрым способом. Я согласен с @izomorphius: создайте несколько таблиц, например: продукт, клиент, работник, транзакцию продаж (удерживает день и платеж) и дайте БД сделать это. C'mon, приятель, пришло время окунуться в воду БД :-) –

+0

Данные уже находятся в базе данных, и они уже хорошо структурированы в базе данных, так что это не проблема. Проблема в том, что у меня есть такие данные в памяти, и мне нужно выполнить сложные математические вычисления. Использование базы данных в памяти может решить ее, но я боюсь влияния ее производительности. Является ли реалистичным бросать все в базу данных в памяти? – Patrick

ответ

1

EDIT: заменить более ранний ответ.

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

+0

Спасибо за предложение. Но, мой пример, вероятно, не был достаточно ясным. Данные, которыми я управляю, не являются чем-то статическим. Используя математические методы, определенные данные моделирования выполняются на данных, и они не обязательно попадают в базу данных. Поэтому выполнение запросов в базе данных для меня не является альтернативой. – Patrick

+0

Существуют, конечно, другие способы решения этой проблемы, чем использование 'qsort()'. – svick

+0

@svick - можете ли вы предложить другие способы, помимо сортировки массива впереди? –

0

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

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

Смежные вопросы