我需要在Google应用引擎中实现“逆文档频率”。我正在寻找提高效率的建议。现在我把基本例程作为,
在解析网页时,我将每对保存到数据存储区,例如
for(String phrase : phrase_collection){
dataStore.put(phrase, domain);
}
稍后计算IDF时,我会从数据存储中获取短语的出现,例如,
for(String phrase : phrase_collection){
long count = dataStore.get(phrase).size();
}
然而速度并不令人满意,并且经常导致30秒超时。在这种情况下,我还有其他挑战,
- 多语言输入(网页)。所以这些短语也使用不同的语言,因此很难缓存。
- 解析网页和排名短语也需要很长时间。整个过程就像charset_detect - > language_detect - >根据不同的语言解析 - >排名。
在GAE中始终启用。
我期待着任何建议!提前谢谢!
答案 0 :(得分:1)
你正在为每个短语做个人获取(和放置)。这自然会非常缓慢,因为您正在对数据存储区进行大量的往返。相反,您应该使用接受可迭代实体或键的put和get变体,并在单个事务中执行它们。
你也应该“脱机”完成这项工作 - 正如Stefan建议的那样,使用后端或任务队列。任务队列可能是更好的匹配。
答案 1 :(得分:0)
您有几个选择:
您可以使用新引入的后端来启动和运行。这样您就不必处理超时问题,也不必担心并行任务。
您可以使用任务队列。 (作为后端的替代方案。)但这取决于你平行任务的能力。
无论如何,你应该开始使用memcache。 (如果您使用JDO,您只需启用它like so)。您还可以考虑切换到“更原生”的持久层,如objectify或twig,它支持asyn访问和/或开箱即用的内存缓存。