Оператор вставки PYODBC в MS Access DB очень медленный

Вот мое решение проблемы. Работает на Python3. Основные функции:

  • Каждая версия Python скомпилирована из источника
  • Все версии установлены локально
  • Не отменяет установку Python вашей системы по умолчанию в любым способом
  • Каждая версия Python изолирована с помощью virtualenv

. Шаги следующие:

  1. Если у вас есть несколько дополнительных версий python которые могут быть установлены другим способом, например, удалить $ HOME / .local / lib / python3.x и т. д. (также глобально установленные). Не трогайте версию python3 по умолчанию.
  2. Загрузите исходный код для разных версий python в следующей структуре каталогов:
    $HOME/
        python_versions/ : download Python-*.tgz packages here and "tar xvf" them.  You'll get directories like this:
          Python-3.4.8/
          Python-3.6.5/
          Python-3.x.y/
          ...
    
  3. На каждом «Python-3.xy /» (не используйте «sudo» на любом из шагов!):
    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
    
  4. В «python_versions /» создайте такие файлы:
    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
    
  5. Теперь, в любое время, когда вы захотите выбрать python3.x, do
    source $HOME/python_versions/env_python3x.bash
    
    , чтобы ввести virtualenv
  6. . В виртуальном каталоге установите свои любимые пакеты python с помощью
    pip install --upgrade package_name
    
  7. Чтобы выйти версия virtualenv и python просто наберите «deactivate»
0
задан S.Keizer 19 March 2019 в 03:45
поделиться

1 ответ

Не используйте внешний код для проверки на наличие дубликатов. Мощь базы данных (даже Access) максимизирует свои операции с наборами данных. Не пытайтесь переписать такой код, тем более что, как вы обнаружили, он неэффективен. Вместо этого импортируйте все во временную таблицу базы данных, а затем используйте Access (или соответствующий механизм данных Access) для выполнения операторов SQL для сравнения таблиц, либо находя, либо исключая повторяющиеся строки. Результаты этих запросов могут затем использоваться для создания и / или обновления других таблиц - все в контексте механизма базы данных. Конечно, создайте временную таблицу (таблицы) с соответствующими индексами и ключами, чтобы максимизировать эффективность.

В то же время, обычно быстрее (можно ли сказать всегда?) При локальном сравнении наборов данных (т.е. таблиц) загружать все значения в некоторую коллекцию с возможностью поиска из одного запроса к базе данных (например, оператора SQL SELECT), затем используйте эту коллекцию в памяти для поиска совпадений. Это может показаться ироничным после моего последнего утверждения о максимизации возможностей базы данных, но большая идея заключается в понимании того, как обрабатывается набор данных в целом. Транспортировка данных туда и обратно между процессами Python и механизмом базы данных, даже если они находятся на одной машине, будет намного медленнее, чем обработка всего внутри процесса Python или всего процесса внутри механизма базы данных. Единственный случай, который может оказаться бесполезным, это когда удаленный набор данных слишком велик для загрузки, но 87 000 значений ключей определенно достаточно малы, чтобы загрузить все значения в коллекцию Python.

0
ответ дан C Perkins 19 March 2019 в 03:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: