Что быстрее? Memcache или файл запроса? (используя файл maxmind geoip.dat) - PullRequest
2 голосов
/ 31 декабря 2010

Я использую Python в Appengine и ищу геолокацию IP-адреса следующим образом:

import pygeoip
gi = pygeoip.GeoIP('GeoIP.dat')
Location = gi.country_code_by_addr(self.request.remote_addr)

(pygeoip можно найти здесь: http://code.google.com/p/pygeoip/)

Я хочу геолокации каждой страницы своего приложения для пользователя, поэтому в данный момент я ищу IP-адрес и сохраняю его в memcache.

Мой вопрос - что быстрее? Поиск IP-адреса каждый раз из файла .dat или извлечение его из memcache? Есть ли другие плюсы / минусы, о которых мне нужно знать?

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

Спасибо!

Tom

РЕДАКТИРОВАТЬ: Спасибо за ответы, memcache, кажется, правильный ответ. Я думаю, что Ник и Леннарт предлагают добавить всю переменную gi в memcache. Я думаю, что это возможно. К вашему сведению - весь файл GeoIP.dat занимает чуть более 1 МБ, поэтому не такой большой.

Ответы [ 3 ]

3 голосов
/ 31 декабря 2010

Если вам нужно выполнить поиск по нескольким процессам (что вы почти наверняка делаете в AppEngine), и вы, вероятно, столкнетесь с одним и тем же IP-адресом много раз за короткий промежуток времени (которым вы, вероятно, являетесь), тогда используйте memcacheвероятно, это хорошая идея для скорости.

Подробнее, так как вы сказали, что вы относительно плохо знакомы с кодированием:

Как правильно говорит Леннарт Регебро, медленная вещь - это чтение файла geoip с диска иразбор это.Индивидуальные запросы будут быстрыми.Однако, если какой-либо конкретный процесс обслуживает только один запрос (что, с вашей точки зрения, в AppEngine, это так), то эта цена будет выплачиваться за каждый запрос.Кэширование недавно использованных поисков в memcache позволит вам делиться этой информацией между процессами ... но только для недавно обнаруженных точек данных.Однако, поскольку любой данный ip может отображаться в пакетах (поскольку это один пользователь, взаимодействующий с вашим сайтом), это именно то, что вам нужно.

Другие альтернативы - предварительная загрузка all данные указывают на memcache.Вы, вероятно, не хотите этого делать, так как у вас ограниченный объем доступной памяти, и вы не будете использовать большую ее часть.(Кроме того, memcache будет отбрасывать его части, если вы достигнете предела памяти, а это значит, что вам все равно придется писать резервный код для чтения из базы данных geoip.) В общем, при ленивом кешировании ищите значениеМедленный способ, когда он вам сначала нужен, а затем держать его для повторного использования - очень эффективный механизм.Memcache специально предназначен для этого, так как он выбрасывает данные, которые не использовались в последнее время, когда он сталкивается с нехваткой памяти.

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

Надеюсь, что это поможет некоторым.

3 голосов
/ 31 декабря 2010

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

Если вы не можете, вы, вероятно, тоже не можете использовать memcached.

1 голос
/ 31 декабря 2010

Для отдельных IP-адресов, которые вы уже получили из базы данных, я бы наверняка поместил их в memcache.Я предполагаю, что файл базы данных относительно велик, и вы не хотите загружать его из memcache каждый раз, когда вам нужно найти один адрес.

Один инструмент, который я знаю, который используют люди, чтобы отслеживать скорость вызовов API AppStats .Он может помочь вам понять, сколько времени занимают различные вызовы API.

Поскольку вы новичок в программировании в целом, я упомяну, что appstats является очень специфичным для App Engine инструментом.Если бы вы просто писали простое приложение на Python, которое собиралось запускать на вашем компьютере, вы могли бы рассчитывать время, просто вычитая две метки времени:

import time
t1 = time.time()
#do whatever it is you want to time here.
t2 = time.time()
elapsed_time = t2-t1
...