Как внедрить эффективный движок картографических фрагментов в Google App Engine?

Я пытаюсь реализовать механизм картографических плиток в Google App Engine.

Данные карты хранятся в базе данных, хранилище данных (большая таблица). Проблема в том, что примерно в одно и то же время может прийти 20 запросов на отрисовку 20 тайлов на основе одного и того же набора строк в базе данных.

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

Может ли кто-нибудь предложить лучший способ сделать это?

Если я использую memcache, мне нужно поместить данные в memcache, но одновременно поступает 20 запросов на данные, тогда, если я сделаю наивную реализацию, то 20 процессов будут писать в memcache, так как они все идут одновременно параллельно.

Я программирую в бета-версии Google Go версии 1 на Google App Engine, я ссылаюсь на документ Python здесь, так как он более полный.

Использованная литература:

Хранилище данных Google http://code.google.com/appengine/docs/python/datastore/overview.html

Leaflet JS, который я использую для отображения листов карты http://leaflet.cloudmade.com/


Чтобы уточнить.

Я генерирую изображения плиток из данных в базе данных, то есть запрашиваю данные у базы данных (это не изображение плитки), затем рисую данные в изображение и визуализирую изображение в формате JPEG. Поскольку GAE эффективен для рисования изображений на стороне сервера, http://blog.golang.org/2011/12/from-zero-to-go-launching-on-google.html


person Phil    schedule 06.03.2012    source источник


Ответы (3)


Я не знаю, как это делает Google App Engine, но у MySQL есть кеш запросов, поэтому, если один и тот же запрос запрашивается дважды подряд, он использует результаты первого для ответа на второй. Google хорошо разбирается в вещах, так что, надеюсь, они это делают. (Возможно, вы сможете выяснить, есть ли они, по времени.)

Одна вещь, в которой вам может понадобиться убедиться, это то, что запросы точно такие же, а не просто возвращают одинаковые результаты. Например, вы не хотите, чтобы query1 был SELECT lat, lng FROM mytable WHERE tileX=1 AND tileY=1, а query2 должен быть SELECT lat, lng FROM mytable WHERE tileX=1 AND tileY=2.

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

person Kaitlin Duck Sherwood    schedule 23.03.2013

  1. Организуйте объекты плитки так, чтобы их можно было найти по ключу, а не по запросу, т. е. используя get() вместо query(). Если вы идентифицируете плитку на основе нескольких критериев, создайте естественный идентификатор, объединив критерии. Например. если вы хотите найти плитку на основе вертикального и горизонтального положения внутри изображения, вы должны сделать: naturalID = imageID + verticalID + horizontalID (вы также можете добавить разделители для лучшего просмотра).

  2. Если у вас есть собственные уникальные идентификаторы, вы можете использовать их для сохранения плитки в Memcache.

  3. Если ваши плитки неизменяемы (= после создания их содержимое не меняется), вы также можете кэшировать их внутри экземпляра на глобальной карте.

Редактировать: удалена ссылка на Objectify, так как я только что понял, что вы используете python. Edit2: добавлен пункт 3.

person Peter Knego    schedule 06.03.2012

На ум приходит несколько вещей:

  1. Как вы запрашиваете плитки? вы должны иметь возможность получать плитки с помощью Key.get(), что намного эффективнее, чем запрос
  2. Попробуйте уменьшить количество запросов, использование уровней должно уменьшить количество запросов примерно до 4 для получения карты.
person Shay Erlichmen    schedule 06.03.2012
comment
Я генерирую изображения плиток из данных в базе данных, то есть запрашиваю данные у базы данных, затем рисую данные в изображение и визуализирую изображение в формате JPEG. Поскольку GAE эффективен для рисования изображений на стороне сервера, blog.golang.org/2011/12/ - person Phil; 06.03.2012
comment
@Phil Я думаю, что PNG даст вам лучшие результаты (качество / сжатие) для данных изображения карты. - person Shay Erlichmen; 06.03.2012
comment
@Phil Также было бы лучше загрузить изображения на стороне клиента? Так делают все картографические сервисы (Google/Bing/Quest). - person Shay Erlichmen; 06.03.2012
comment
Спасибо, Шей, да, согласен. Любое другое предложение? - person Phil; 06.03.2012