Как реализовать эффективный движок листов карты в Google App Engine? - PullRequest
1 голос
/ 06 марта 2012

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

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

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

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

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

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

Ссылки:

Google datastore 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

Ответы [ 3 ]

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

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

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

2 голосов
/ 23 марта 2013

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

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

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

1 голос
/ 06 марта 2012

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

  1. Как вы запрашиваете плитки?вы должны иметь возможность получать плитки с помощью Key.get (), который намного эффективнее, чем запрос
  2. . Попробуйте уменьшить количество запросов, используя уровни, чтобы уменьшить количество запросов до 4 для получения карты.
...