我有一个索引子查询,我想在一个字符串数组上运行。问题是,如果我去:
.map()
things
按顺序迭代.map()
并且不会通过跨分片(慢速)并行运行来使用群集的真正功率。
我觉得创建一个新表并将数组的项作为表行插入,这使得r.table(things).map(function(i) {
return invokeIndexedSubQuery(i);
}) // across shards -- fast
执行效率与预期一样有点奇怪:
.map()
文档中是否提到{{f.value.cityForm | lowercase}}
作为跨分片执行的方法?如何直接在对象(如数组)上使用它?
v2.3.4
答案 0 :(得分:0)
RethinkDB在输入数据上分发 try
{
db.SaveChanges();
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
Exception raise = dbEx;
foreach (DbEntityValidationResult validationErrors in dbEx.EntityValidationErrors)
{
foreach (DbValidationError validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}", validationErrors.Entry.Entity.ToString(), validationError.ErrorMessage);
// raise a new exception nesting
// the current instance as InnerException
raise = new InvalidOperationException(message, raise);
}
}
throw raise;
}
个命令。如果您的数据在表中,map
将分发到每个分片(如果您有分片表,则可以在另一个服务器上)。如果您的数据在数组中,map
将在包含您的数据的线程上执行。
RethinkDB执行此操作的原因可能是它无法判断将数据复制到其他线程或服务器以及聚合结果的开销是否值得付出努力,在许多情况下它并非如此。
您有时可以优化此行为,例如,您可以使用map
代替r.range
来获取顺序数据,如果r.expr([...])
执行插入,您有时可以转为f
进入x.map(f)
或执行t.insert(x)
,get
。