Бенчмарк на открытие векторного слоя

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Бенчмарк на открытие векторного слоя

Сообщение Voltron » 10 июл 2012, 12:44

yellow-sky писал(а):либо это из-за определения типа геометрий (хотя в хэдере шейп файла есть этот тип)
Бегло посмотрел код, тип геометрии определятся по заголовку, но если формат такого не поддерживает (например, GML) то тип геометрии определяется по первому объекту слоя.
yellow-sky писал(а):либо из-за проверки индекса.
Не вижу в коде вообще ничего про индекс. По идее, этим вопросом должен заниматься OGR (это только мое ИМХО)

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Бенчмарк на открытие векторного слоя

Сообщение yellow-sky » 10 июл 2012, 13:11

Да, это задача OGRa. Вечером посмотрю, что к чему.

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: Бенчмарк на открытие векторного слоя

Сообщение bim2010 » 10 июл 2012, 14:15

1. Почему такая большая разница при открытии векторного слоя в QGIS установленным под Windows и Linux?
2. Почему такая большая разница при открытии векторного слоя в QGIS и wxGIS?
Разве оба не используют один тот же Gdal/OGR?

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Бенчмарк на открытие векторного слоя

Сообщение Дмитрий Барышников » 10 июл 2012, 16:14

yellow-sky писал(а):Да, это задача OGRa. Вечером посмотрю, что к чему.
Не уверен что это его задача. Но функционал какой-то есть.
Я там пользуюсь отдельной функцией CPLQuadTreeCreate по созданию пространственного дерева. К сожалению - файл при этом читается полностью, но один раз. Встроенные в GDAL/OGR средства создания пространственных индексов в wxGIS не используются.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Бенчмарк на открытие векторного слоя

Сообщение Voltron » 10 июл 2012, 18:24

Bishop писал(а):Я там пользуюсь отдельной функцией CPLQuadTreeCreate по созданию пространственного дерева.
Ок, гляну. Может и получится прикрутить.

Кстати, QGIS из ветки threading открывает это слой шустрее, разница где-то в 20-25%

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Бенчмарк на открытие векторного слоя

Сообщение yellow-sky » 12 июл 2012, 10:42

Беглый анализ кода QGIS/GDAL, привел к интересным результатам.
1) При открытии шейпфайла, ни qgis, ни ogr не проводит его сканирование и сканирование его индекса. Так что всё, что я предполагал о лишнем переборе шейпфайла ogr'ом - мои безосновательные домыслы.
2) Тип геометрии и максимальный охват читаются из заголовка самого шейпфайла. Эта операция очень быстрая и не может быть причиной, такой задержки при добавлении слоя на карту.
3) Пространственный индекс. В архиве вообще нет индекса qix. Есть только езривский sbn. Потому, если у вас старый gdal (не транк), то работа с шейпфайлом ведется вообще без индекса. Это не есть проблема ogr, так как gdal - всего лишь библиотека унифицированного доступа к геоданным. Тут появляется вопрос к QGIS. В аналогичный ситуации, АркГИС пытается молча создать файл с индексом. Может QGIS должен вести себя схожем образом - при добавлении шейпфайла, если тот не имеет индекса, предлагать пользователю создать его? Не все пользователи знают, что есть специальная кнопка, для создания индекса. Еще меньше догадывается, что добавленный слой может не иметь его в данный момент.
4) Предварительная причина долгого открытия - отрисовка. Пока у меня выходит, что львиную долю на открытии съедает именно она. Маленький тест - попробуйте перед добавлением отключить рендеринг и добавить слой. У меня добавляется мгновенно. Включение слоя(первая отрисовка) и вторая отрисовка по времени практически не отличается. Индекс тоже не причем, так как отрисовывается весь охват слоя. Остается свалить все на долгую отрисовку большого количества вертексов.
Боле глубоких тестов пока не проводил. Предстоит выяснить, какая из операций занимает больше всего времени - получение данных или их непосредственный вывод на холст. Буду продолжать копать.

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Бенчмарк на открытие векторного слоя

Сообщение yellow-sky » 12 июл 2012, 10:45

Подскажите плиз плагин, который считает статистику по геометриям в слое - количество вертексов всего, в среднем на геометрию, мин-макс и тд?

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Бенчмарк на открытие векторного слоя

Сообщение Voltron » 12 июл 2012, 10:55

yellow-sky писал(а):1) При открытии шейпфайла, ни qgis, ни ogr не проводит его сканирование и сканирование его индекса. Так что всё, что я предполагал о лишнем переборе шейпфайла ogr'ом - мои безосновательные домыслы.[]
2) Тип геометрии и максимальный охват читаются из заголовка самого шейпфайла. Эта операция очень быстрая и не может быть причиной, такой задержки при добавлении слоя на карту.
Все как я и говорил парой постов выше.
yellow-sky писал(а):3) Пространственный индекс. В архиве вообще нет индекса qix. Есть только езривский sbn. Потому, если у вас старый gdal (не транк), то работа с шейпфайлом ведется вообще без индекса. Это не есть проблема ogr, так как gdal - всего лишь библиотека унифицированного доступа к геоданным.
Когда я говорил про OGR и индекс, имел в виду то, что именно OGR должен использовать индекс (разумеется, если он есть) при чтении объектов из файла. А то как-то странно выглядит ситуация, когда библиотека, занимающаяся непосредственно чтением данных, игнорирует индекс и для доступа к объекту в средине файла выполняет полный перебор.
yellow-sky писал(а):Тут появляется вопрос к QGIS. В аналогичный ситуации, АркГИС пытается молча создать файл с индексом. Может QGIS должен вести себя схожем образом - при добавлении шейпфайла, если тот не имеет индекса, предлагать пользователю создать его?
Такой тикет уже давно есть.
yellow-sky писал(а):Не все пользователи знают, что есть специальная кнопка, для создания индекса. Еще меньше догадывается, что добавленный слой может не иметь его в данный момент.
ИМХО, проблема пользователя
yellow-sky писал(а):4) Предварительная причина долгого открытия - отрисовка. Пока у меня выходит, что львиную долю на открытии съедает именно она. Маленький тест - попробуйте перед добавлением отключить рендеринг и добавить слой. У меня добавляется мгновенно.
Я тебе даже больше скажу (благо, ковырял эту часть кода, когда переносил threading на 1.7.х). Это основная и единственная причина.
yellow-sky писал(а):Индекс тоже не причем, так как отрисовывается весь охват слоя.
А индекс тут и не поможет. От него еще есть какая-то польза если при открытии отображается не весь слой, а лишь его небольшая часть. Если же слой рисуется в полном охвате то наличие/отсутствие индекса ничего не меняет.
yellow-sky писал(а):Боле глубоких тестов пока не проводил. Предстоит выяснить, какая из операций занимает больше всего времени - получение данных или их непосредственный вывод на холст. Буду продолжать копать.
А они (тесты) и не нужны. Больше всего времени занимает отрисовка.

FYI, в QGIS 2.0 планируется многопоточный доступ к данным и многопоточная же отрисовка.

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Бенчмарк на открытие векторного слоя

Сообщение yellow-sky » 12 июл 2012, 11:04

Voltron писал(а):FYI, в QGIS 2.0 планируется многопоточный доступ к данным и многопоточная же отрисовка.
Многопоточный доступ - все ясно. Многопоточная отрисовка - я понимаю как это можно организовать для нескольких слоев. Но как он поможет для отрисовки одного слоя? В Qt холсты поддерживают многопоточный доступ?

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Бенчмарк на открытие векторного слоя

Сообщение Ariki » 12 июл 2012, 22:05

Многопоточность нас вряд ли спасет. Есть подозрение, что во всем виноваты большие полигоны с дырками, заливка которых выполняется крайне медленно.
Вот, предположительно, проблемный участок кода в qgssymbollayerv2.cpp:

Код: Выделить всё

    // polygon with holes must be drawn using painter path
    QPainterPath path;
    QPolygonF outerRing = points;
    path.addPolygon( outerRing );

    QList<QPolygonF>::const_iterator it = rings->constBegin();
    for ( ; it != rings->constEnd(); ++it )
    {
      QPolygonF ring = *it;
      path.addPolygon( ring );
    }

    p->drawPath( path );
Самому разбираться с компиляцией и отладкой QGIS у меня пока духу не хватает, но превратив в тестовом слое дырки в отдельные полигоны, я получил отрисовку за 5 секунд вместо 43. То есть надо избавляться от QPainterPath. Если в QGIS каждый слой отрисовывается и буферизуется отдельно (я пока не знаю), то, думаю, это реально.

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: Бенчмарк на открытие векторного слоя

Сообщение bim2010 » 12 июл 2012, 22:17

Следующий эксперимент, на мой взгляд, подтверждает предположения yellow-sky.
К уже загруженному в QGIS слою VLIZ Maritime Boundaries Geodatabase пытаюсь загрузить другой слой состоящий всего из 5 точечных объектов. И сколько вы думает он грузиться?
Столько же, как и VLIZ.
Т.е.
Предварительная причина долгого открытия - отрисовка.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Бенчмарк на открытие векторного слоя

Сообщение Voltron » 13 июл 2012, 11:08

Ariki писал(а):Многопоточность нас вряд ли спасет.
А кто-то говорил, что это панацея? Тем не менее, если вы сравните скорость открытия большого слоя в обычной QGIS и в версии с частично реализованной многопоточностью и другими оптимизациями, то увидите — второй вариант быстрее.

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Бенчмарк на открытие векторного слоя

Сообщение yellow-sky » 13 июл 2012, 12:44

Voltron писал(а): А кто-то говорил, что это панацея? Тем не менее, если вы сравните скорость открытия большого слоя в обычной QGIS и в версии с частично реализованной многопоточностью и другими оптимизациями, то увидите — второй вариант быстрее.
Я двумя руками за многопоточность. И считаю что это единственный способ серьезно ускорить QGIS. Саш, а threading ветку обновили до транка или 1.8? Вчера я экспериментировал с многопоточностью в транке, и даже простое добавление потоков для перепроицирования векторов дает некоторые выигрыши для больших геометрий.
Может начнем потихоньку переносить threading в транк?
И да, судя по документации QImage, который сейчас используется для отрисовки, потокобезопасный. Это дает шанс, что даже отрисовка одного слоя может быть многопоточной. Но в коде много мелочей, так например QPixmap не является таковым, а используется часто.

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Бенчмарк на открытие векторного слоя

Сообщение yellow-sky » 13 июл 2012, 12:55

Еще одна задумка, которую вчера попробовал, но к сожалению не получил ни какого выигрыша по скорости из-за используемых структур данных (QPolygonF в частности). Перед самой отрисовкой, после того как координаты переведены в экранные, имеет смысл отбрасывать те, которые ни как не влияют на отображение, те которые не различимы на текущем масштабе. Для полигонов из рассматриваемого слоя, была просто потрясающая статистика. На максимальном экстенте, при том что сам полигон содержал 6700 вертексов, при выводе на экран различимыми являются только 577. Но удаление их из структуры QPolygonF занимает очень много времени. Потому выигрыша я пока не добился :(

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Бенчмарк на открытие векторного слоя

Сообщение Ariki » 13 июл 2012, 13:00

В идеале это надо делать при выборке данных из источника, но не знаю, реализуемо ли в OGR

Ответить

Вернуться в «Общий - ПО»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя