joh*_*ley 10 java google-app-engine chunking google-cloud-datastore
我运行一个查询,它目前返回1400结果,因此我在日志文件中收到以下警告:
com.google.appengine.api.datastore.QueryResultsSourceImpl logChunkSizeWarning:此查询没有在FetchOptions中设置的块大小,并返回了超过1000个结果.如果此查询的结果集对此查询很常见,请考虑设置块大小以提高性能.
我找不到任何关于如何实际实现这个的例子,这里有关于python的问题,但是因为我使用java并且不理解python,我正在努力翻译它.
另外这个查询(下面)正在执行17226cpu_ms,这感觉太长了,我甚至无法想象如果我说5000个联系人需要在客户端搜索它们会发生什么(就像你使用googlemail联系人一样! )
我的代码是:
int index=0;
int numcontacts=0;
String[][] DetailList;
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Query query = pm.newQuery(Contact.class, "AdminID == AID");
query.declareParameters("Long AID");
query.setOrdering("Name asc");
List<Contact> Contacts = (List<Contact>) query.execute(AdminID);
numcontacts=Contacts.size();
DetailList=new String[numcontacts][5];
for (Contact contact : Contacts)
{
DetailList[index][0]=contact.getID().toString();
DetailList[index][1]=Encode.EncodeString(contact.getName());
index++;
}
} finally {
pm.close();
}
return (DetailList);
Run Code Online (Sandbox Code Playgroud)
我在这里找到了以下两个条目:
但实际上并未涉及有关如何实施或使用这些选项的任何细节.我猜它是一个服务器端进程,我猜你要设置某种循环来一次抓取一个块,但我该如何实际做到这一点?
如果没有一个实际的例子,我是怎么想找到这样的东西呢?在我看来,这里的其他人似乎"只知道"该怎么做..!
抱歉,如果我没有以正确的方式提出问题,或者我只是一个愚蠢的新手,但我不知道还有什么可以解决这个问题!
遇到同样的问题,最后一条评论是一个月前的,所以这是我发现的关于繁重数据集查询的内容。
我想在阅读了谷歌文档文章中的这些行(顺便提到的 python 中的那一行)后,我将使用“查询游标”技术:
本文是为 SDK 版本 1.1.7 编写的。从版本 1.3.1 开始,查询游标 ( Java | Python ) 已经取代了下面描述的技术,并且现在是对大型数据集进行分页的推荐方法。
在关于“查询光标”的谷歌文档中。该文档的第一行准确地给出了为什么需要光标:
查询游标允许应用程序执行查询并检索一批结果,然后在后续 Web请求中获取同一查询的其他结果,而无需查询偏移量的开销。
该文档还提供了使用游标技术的 servlet 的java 示例。有一个提示如何为客户端生成安全游标。最后,暴露了游标的局限性。
希望这能为您解决问题提供线索。
关于 range 和offset的小提醒,如果忘记的话会对性能产生相当大的影响(我就是这么做的^^):
起始偏移量对性能有影响:数据存储区必须检索并丢弃起始偏移量之前的所有结果。例如,范围为 5、10 的查询从数据存储区获取十个结果,然后丢弃前五个结果并将剩余的五个结果返回给应用程序。
编辑:在使用 JDO 时,我一直在寻找一种方法,允许我以前的代码在单个查询中加载 1000 多个结果。所以,如果你也使用 JDO,我发现了这个老问题:
Query query = pm.newQuery(...);
// I would use of value below 1000 (gae limit)
query.getFetchPlan().setFetchSize(numberOfRecordByFetch);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5341 次 |
| 最近记录: |