Почему чтение базы данных sqlite медленнее на разных компьютерах с одинаковым оборудованием? - PullRequest
2 голосов
/ 23 июля 2011

Хорошо, я наблюдаю за поведением, которое я бы назвал «неожиданным», и мне любопытно, может ли кто-нибудь предложить и понять, что происходит на земле.Я постараюсь быть кратким ...

У меня есть база данных sqlite, к которой я обращаюсь с помощью Python (150 тыс. Строк, 11 таблиц) для обучения нейронной сети.Концы несущественны, но это означает, что мои точки данных хранятся в одной таблице в виде довольно больших двоичных объектов, а объем БД составляет около 5 ГБ.Поскольку я извлекаю только определенные строки (из-за перекрестной проверки или других видов фильтрации), я обнаружил, что индексация по некоторым значимым столбцам приводит к значительному увеличению скорости.Когда светит солнце, я могу выбрать, выбрать и отформатировать около 500 точек данных примерно за 2 секунды.Это замечательно.

Однако, как может засвидетельствовать любой, кто знаком с нейронными сетями / backprop / SGD, этот процесс может - в зависимости от данных и архитектуры - длиться вечно.Чтобы оптимально распараллелить вещи, я реквизировал несколько машин (Mac Pro, 8 ГБ ОЗУ, 16 ядер, которые знают, с какой скоростью), чтобы запускать учебные сценарии в разных условиях в разных потоках.Из-за ограничений памяти потолок составляет около 6 или 7 отдельных потоков, каждый из которых обращается к одному и тому же файлу базы данных.Теперь, насколько мне известно, эти машины идентичны.

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

Я невозьми.Я сделал то же самое для всех случаев.Файлы базы данных идентичны при копировании, а затем я удаляю / создаю те же индексы, поскольку я почти уверен, что индексы sqlite ссылаются на абсолютные местоположения на диске.Я нахожусь в среде Unix, поэтому фрагментация файлов не должна быть причиной (верно?).В некоторых конфигурациях параллелизм не является проблемой, в то время как другие приводят к узким местам.С тех пор я проверил, и машины фактически идентичны на бумаге.И самое непонятное для меня - это то, что производительность зависит от конфигурации одной машины.

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

ОБНОВЛЕНИЕ: Возможно, я «решил» свою проблему, но ни в коем случае не ответил на этот вопрос,Я обнаружил, что если я в основном включаю и выключаю файл базы данных в каждой системе, я в конечном итоге получаю одинаковую производительность на всех компьютерах.Этот процесс похож на ...

    while unhappy:
 1. Drop all indexes
 2. Create new indexes
 3. Make a handful of select/fetch calls
 4. Commit / quit / restart

Через некоторое время, похоже, что-то удовлетворительное.Хотя понятия не имею, почему.

Ответы [ 2 ]

2 голосов
/ 24 июля 2011

Если вы не используете базы данных с auto_vacuum = FULL, возможно, у вас есть фрагментация структуры данных в файле базы данных. Вы пытались запустить VACUUM в своих базах данных?

0 голосов
/ 23 июля 2011

Является ли сама файловая система также сконфигурированной одинаково?

И ext3 выполняет фрагментацию: Фрагментация суперпользователя

...