从一百万条记录中查询 - Linq4j

时间:2013-04-20 22:44:01

标签: java google-app-engine linq4j

我刚用GAE和持久性地图测试了Linq4j:

@Test
public void testLinq4j() {
    Map<Long, String> map = Humongous.getMap("Users", LongParser.getInstance());

    map.put(1L, "user1");
    map.put(2L, "user2");

    assertNotNull(map.get(1L));
    assertNotNull(map.get(2L));

    final List<Grouping<Object, Map.Entry<Long, String>>> result =
              new ArrayList<Grouping<Object, Map.Entry<Long, String>>>();

    Linq4j.asEnumerable(map.entrySet())
        .where(new Predicate1<Map.Entry<Long,String>>() {
            @Override
            public boolean apply(Map.Entry<Long, String> v1) {
                if (v1.getKey().equals(2L)){ // filter only those with ID == 2
                    return true;
                }
                return false;
            }
        })
        .groupBy(
                new Function1<Map.Entry<Long, String>, Object>() {
                    public Object apply(Map.Entry<Long, String> entry) {
                        return entry.getValue();
                    }
                })
                .into(result);

    assertEquals(2, map.size());
    assertEquals(1, result.size());
}

问题是:

  • Linq4j如何在内部使用map.entrySet()或其方法asEnumerable?在我的情况下,map.entrySet()最终归结为数据存储区PreparedQuery,其中包含数据存储区中与查询匹配的所有记录的安全迭代器 - 在持久映射的情况下,它匹配每个记录具体kind;这可能真的很大。如果我的地图,如上面的“用户”包含的内容就像一百万条记录一样,那么这个查询迭代每个Map.Entry会非常慢吗?

  • linq4j在找到toList() java.util.List`时调用Collection<E>? I ask this because calling this methods copied all the Datastore keys into会导致HeapOverFlowError ......

0 个答案:

没有答案