2014-05-14 70 views
0

我有兴趣在我的应用程序中添加拼写检查程序 - 我正在计划使用difflib和〜147kB大(13,025字)的自定义单词列表。应用引擎 - 何时使用memcache vs搜索索引(和搜索API)?

当这个列表测试用户查询,那就更有意义:

  1. 负荷字典到内存缓存(?我从数据存储猜),并保存在内存缓存或
  2. 建立索引对于搜索API,并通过用户查询在那里

我想我问的是哪个更快:memcache或搜索索引?

谢谢。

回答

1

Memcache肯定是更快。

另一个重要的考虑因素是成本。 Memcache API调用是免费的,而Search API调用有自己的quota and pricing

顺便说一下,您可能会将您的库存储为静态文件,因为它很小且不会更改。无需将其存储在数据存储区中。

+0

感谢您的回复 - 我的印象是我们无法访问GAE中的文件系统。有没有办法从应用程序引擎脚本访问本地静态文件? – user3058197

+1

您无法写入文件,但可以读取静态文件。 –

1

Memcache速度更快,但您需要考虑以下事项。

  1. 它是不可靠的,在任何时刻实体可以清除。因此,您的代码需要非缓存数据的后退

  2. 您只能通过密钥获取,因此如您所说,您需要将整个字典存储在memcache对象中。

  3. 每个memcache实体只能存储1MB。如果你的字典比较大,你将不得不跨越多个实体。好吧,在你的情况不相关。

还有一些其他的选择。字典多久更新一次?

这是一个替代策略。

如果您想更新应用程序更新之外的字典,可以将其存储在文件系统(需要应用程序更新)或GCS中。然后,您可以在启动时或首次请求时将每个实例中的字典加载到内存中,并将其缓存在正在运行的实例级别,然后您将不会有任何服务添加延迟的往返行程。这也将是更简单的代码明智的(即没有回退,如果不在memcache等)

这里是一个例子。在这种情况下,代码位于模块中,并根据需要导入。我正在使用yaml文件进行其他配置,它可以像json加载字典一样简单,或者您可以在模块中定义一个python字典。

_modsettings = {} 

def loadSettings(settings='settings.yaml'): 

    x= _modsettings 
    if not x: 
     try: 
      _modsettings.update(load(open(settings,'r').read())) 
     except IOError: 
      pass 

    return _modsettings 

settings = loadSettings() 

然后每当我想设置字典我的代码只是指mymodule.settings。 通过在预热请求期间导入此模块,您将不会遇到竞争条件,或者在面向用户的请求期间不得不导入/解析字典。您可以根据需要添加更多错误陷阱;-)

+0

谢谢你的回复 - 我遵循你所说的除了这个:“在运行实例级缓存它”?这是一个独立于我所假设的memcache的缓存吗?如果这是一个单独的缓存,您是否知道访问/操作它的教程?谢谢。 – user3058197

+0

如果将字典加载到内存中,则可以将它分配给模块级变量,然后任何请求都可以访问它。它是有效的共享,所以你不想在运行时以任何方式更新它。 –

+0

谢谢 - 你知道我如何从文件系统(即不是GCS)加载文件吗?我不能做类似open('dictionary.txt','r')的东西,我可以吗? 编辑:我想我可以把字典放进一个* .py文件并导入它,对吧?我认为导入的模块保留在内存中.. – user3058197