2013-12-20 2 views
0

Предположим, у меня есть (MySQL) DB. Я хочу, чтобы автоматизировать процесс обновления этой базы данных с помощью приложения, что будет:Контейнер для представления таблицы БД в памяти

1. Import from DB 
2. Calculate updated data 
3. Export back updated data 

Время важно, я не хочу, чтобы импортировать то время как рассчет, на самом деле я не хочу никаких запросов, то ; Я хочу импортировать (а) таблицу (ы) в целом, , затем вычислить. Итак, мой вопрос: если строка представлена ​​экземпляром класса, то в какой контейнер я помещаю эти объекты?

A? Множество? Как насчет упорядоченного или неупорядоченного? Просто используйте то, что кажется лучшим для моего дела в соответствии с большими временами O? Любые специальные ловушки, чтобы попасть сюда? Разве этот случай не отличается от данных, «рожденных в памяти», поэтому единственные вещи, которые можно учитывать помимо накладных расходов, это «я хочу, чтобы поиск или вставка были быстрее»?

Возможно, лучший маршрут - использовать какой-то ORM, но, допустим, я не хочу.

Я видел, что некоторые приложения используют boost::unordered_set, и я подумал, если есть конкретная причина для ее использования ...

Я использую JDBC-подобный интерфейс, как разъем (libmysqlcpp).

ответ

1

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

Но моя главная забота о таком дизайне заключается в том, что он быстро задушит вашу сеть, вашу базу и базу данных. Если у вас есть большой стол, вы:

  • выбрать все данные из таблицы
  • извлечь все данные по сети
  • процесса на вас часть машины (некоторые столбцы?) Или полноту данные
  • передать данные по сети
  • обновление ваших строк (или удалить/заменить возможно)

Почему вы не рассмотреть возможность работы непосредственно на mysq l сервер? Вы создаете свой user defined function, который работает с прямыми данными, сохраняя сеть и даже используя тот факт, что mysql построен для обработки гигантского количества данных, количество, которое контейнер с памятью не построен для обработки.

+0

Что делать, если расчет довольно сложный? Используется сериализованный входной файл в несколько сотен МБ, и после разбора вычисление выполняется с использованием данных, которые мы имеем до сих пор (поступающих из БД), и новых данных (поступающих из входного файла). Затем БД необходимо обновить (возможно, на некоторых столбцах, может быть, несколько таблиц) с результатом вычисления. Я хочу сделать это в cpp, потому что я мало что знаю о базах данных, и я не уверен, предназначены ли для этого функции, определенные пользователем в БД. – Innkeeper

+0

DB оценивается как ~ 25 таблиц, ~ 10M записей в наибольшей. Входные файлы имеют размер до ~ 1 ГБ, время обработки в cpp составляет ~ 2-3 часа. Время импорта/экспорта проверяется с одинаковыми размерами таблиц и никогда не превышает 20-30 минут, что приемлемо в этом случае. (ПРИМЕЧАНИЕ: это оценки, код еще не написан, это этап проектирования) – Innkeeper

+0

Возможно, есть реальные причины использовать предлагаемый дизайн. Я вижу лишь небольшую часть вашей проблемы. :) Из того, что вы сейчас говорите, я обрабатываю данные из файла, внедряю его в БД и «примиряю» его в БД.Определенный пользователем proc может быть выполнен в C++, и, возможно, больше того, что можно сделать на C++. Единственная проблема, с которой я столкнулся бы с таким дизайном, - это слишком сильно загружать процессор в ящик БД, если пользователи все еще его запрашивают. – Johan

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