Хорошо, я наблюдаю за поведением, которое я бы назвал «неожиданным», и мне любопытно, может ли кто-нибудь предложить и понять, что происходит на земле.Я постараюсь быть кратким ...
У меня есть база данных 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
Через некоторое время, похоже, что-то удовлетворительное.Хотя понятия не имею, почему.