我的 Python 高复制数据存储应用程序需要一个包含 100,000 到 1,000,000 个条目的大型查找表。我需要能够为某些方法提供代码,该方法将返回与该代码关联的值(如果没有关联,则返回 None)。例如,如果我的表包含可接受的英语单词,那么我希望函数在找到该单词时返回 True,否则返回 False(或 None)。
我当前的实现是为每个表条目创建一个无父实体,并让该实体包含任何关联的数据。我将该实体的数据存储键设置为与我的查找代码相同。(我将所有实体放入它们自己的命名空间以防止任何键冲突,但这对于这个问题不是必需的。)然后我只需在代码上调用 get_by_key_name() 并获取相关数据。
问题是我无法在事务期间访问这些实体,因为我试图跨越实体组。回到我的例子,假设我想对聊天会话中使用的所有单词进行拼写检查。我可以访问聊天中的所有消息,因为我会给他们一个共同的祖先,但我无法访问我的单词表,因为那里的条目是无父的。我必须能够在事务期间引用该表。
请注意,我的查找表是固定的,或者很少更改。这再次与拼写检查示例匹配。
一种解决方案可能是在一个事务期间加载聊天会话中的所有单词,然后对它们进行拼写检查(保存结果),然后启动第二个事务,对保存的结果进行拼写检查。但这不仅效率低下,而且可能已将聊天会话添加到事务之间。这似乎是一个笨拙的解决方案。
理想情况下,我想告诉 GAE 查找表是不可变的,因此我应该能够在不抱怨事务中跨越实体组的情况下对其进行查询。但是,我看不出有任何方法可以做到这一点。
将表条目存储在内存缓存中很诱人,但这也有问题。这是大量的数据,但更麻烦的是,如果 GAE 启动了一个 memcache 条目,我将无法在事务期间重新加载它。
有谁知道大型全局查找表的合适实现?
请理解,我不是在寻找拼写检查网络服务或类似的东西。我使用单词查找作为示例只是为了清楚地说明这个问题,并且我希望为任何类型的大型查找表提供通用解决方案。