小编dou*_*ret的帖子

.NET协方差

我有这个简单的代码:

public interface IReader<out T>
{
    IEnumerable<T> GetData();
}
Run Code Online (Sandbox Code Playgroud)

这个接口应该在T上协变,我用这种方式:

private static Func<bool> MakeSynchroFunc<T>(IReader<T> reader) where T : IComposite
{
    return () => Synchronize(reader);
}
Run Code Online (Sandbox Code Playgroud)

注意T的约束来实现IComposite.同步方法接受IReader<IComposite>输入:

private static bool Synchronize(IReader<IComposite> reader)
{
    // ......
}
Run Code Online (Sandbox Code Playgroud)

编译器告诉我它无法转换IReader<T>IReader<IComposite>尽管T的约束和IReader的协方差.

我在这里做错了吗?编译器应该能够验证约束,协方差应该让我使用我IReader<T>IReader<Icomposite>,不是吗?

谢谢.

.net c# covariance

9
推荐指数
1
解决办法
369
查看次数

ElasticSearch可预期的表现

我正在努力将搜索引擎从sql数据库移植到elasticsearch.这样做的主要原因是能够轻松地计算构面.

目前我们通过生成precalc表在sql上有方面.它运行良好,但维护很痛苦,只有数据子集支持facet.

现在ES原型正在工作,我正在对这两个解决方案进行基准测试,看起来ES版本在性能方面略逊于sql版本(在可维护性方面,它要好得多).

我使用了完全相同的机器配置,一个64位平台,32 GB的RAM,一个ssd磁盘和一个3ghz的四核Intel Xeon来比较sql和ES.

文档不小,大约有200个字段,根据请求,使用基于脚本的排序,并且总是在doc的8个字段上计算facet.

该索引包含3百万个文档,如果我没有记错的话它与ES可以处理的相对较小.

在查询方面,我使用过滤查询,对于某些请求,我使用custom_filters_score查询来计算得分并将其用于排序.

由于方面的原因,某些过滤器是全局的,但过滤后的查询中总会有一些过滤器,因此应减少扫描的文档数量(并非所有索引都被扫描).

我在测试中使用了两个度量:服务器执行搜索所花费的时间,以及并行运行100个线程的客户端执行的查询数量.

对于elasticsearch,每个查询在服务器上花费的平均时间大约为500毫秒(并行100个查询),客户端上的平均查询时间大约为160(构建查询,发送它时会丢失一些ms,接收结果并解析它们).这是一个索引有1个碎片和0个副本,当我增加碎片/复制品的数量时,性能显着下降.

对于sql,执行查询所花费的平均时间约为360毫秒(同上,并行运行100个查询),客户端上的平均查询次数约为200.

我知道这很难比较,但由于我对预期的结果一无所知,我想知道是否有人可以评论这些措施.

也许我错过了一些东西,它应该快一个数量级,或者这些是类似环境的典型结果,我不知道.

在我的案例中我能期待什么?您在ES的类似情况下观察到了什么?它是否支持并发请求?在同时进行100次查询时,执行查询的时间是否应该在500毫秒的范围内?有没有办法改善搜索性能?

欢迎任何信息或评论,这是决定工业化原型的重要部分.

谢谢.

performance database-performance elasticsearch

5
推荐指数
1
解决办法
2708
查看次数