Лучший способ обработать большую базу данных? - PullRequest
1 голос
/ 20 августа 2009

Справочная информация:

У меня есть один файл базы данных Access (.mdb) с полдюжиной таблиц в нем. Этот файл размером ~ 300 МБ, поэтому не огромный , но достаточно большой, чтобы я хотел быть эффективным. В нем есть одна главная таблица, таблица клиента. В других таблицах хранятся данные, такие как проведенные консультации, несколько дополнительных полей «один к одному», что-то в этом роде.

Задача:

Мне нужно написать программу для преобразования этой базы данных Access в набор XML-файлов, по одному на каждого клиента. Это приложение для преобразования базы данных.

Параметры:

(как я вижу)

  1. Загрузка всей базы данных Access в память в виде List неизменяемых объектов, а затем использование Linq для поиска в этих списках необходимых мне связанных данных.

    • Преимущества:
      • Простое распараллеливание. Запуск потока ThreadPool для каждого клиента. Поскольку все объекты являются неизменяемыми, они могут свободно использоваться потоками, что означает, что все потоки имеют доступ ко всем данным в любое время, и все они загружаются ровно один раз.
    • (возможно) Минусы:
      • Может использовать дополнительную память, загружать осиротевшие предметы, предметы, которые больше не нужны, и т. Д.
  2. Используйте Jet для запуска запросов к базе данных для извлечения данных по мере необходимости.

    • Преимущества:
      • Потенциально более легкий вес. Загружает только те данные, которые необходимы, и по мере необходимости.
    • (возможно) Минусы:
      • Потенциально тяжелее! Может загружать элементы более одного раза и, следовательно, использовать больше памяти.
      • Возможно, трудно парализовать, если Jet / OleDb не поддерживает одновременные запросы (кто-то может подтвердить или опровергнуть это?)
  3. Другая идея?

Каковы мысли StackOverflows о наилучшем способе решения этой проблемы?

Ответы [ 4 ]

1 голос
/ 21 августа 2009

Если ваша цель - преобразовать вашу базу данных в XML-файлы, вы можете:

  1. подключиться к вашей базе данных через соединение ADO / OLEDB
  2. последовательно открывайте каждую из ваших таблиц как наборы записей ADO
  3. Сохраните каждый набор записей в виде файла XML:

    myRecordset.save myXMLFile, adPersistXML

Если вы работаете с файлом Access, используйте currentProject.accessConnection в качестве соединения ADO

1 голос
/ 20 августа 2009

Создание частей XML из SQL. Сохраняйте каждую извлеченную запись в файле по мере ее извлечения.

Пример:

SELECT '<NODE><Column1>' + Column1 + '</Column1><Column2>' + Column2 + '</Column2></Node>' from MyTable
0 голосов
/ 20 августа 2009

Я бы склонялся к джету, так как вы можете более точно указать, какие данные вы хотите получить.

Также я заметил большой размер файла, это проблема, с которой я недавно столкнулся на работе. Это доступ 95 или 97 дБ? Если преобразование БД в 2000 или 2003, а затем обратно в 97 уменьшит этот размер, то в некоторых случаях это будет ошибкой. База данных, с которой я имел дело, утверждала, что она составляет 70 мегабайт после того, как я преобразовал ее в 2000, и снова она была 8 мегабайт.

0 голосов
/ 20 августа 2009

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

Кроме того, в зависимости от ваших потребностей, вы можете извлечь непосредственно из Access -> XML, если это ваша настоящая конечная игра.

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

...