【发布时间】:2015-04-12 22:13:15
【问题描述】:
我要做的是从大约有 400 万行的表中获取行,以针对 ElasticSearch 对其进行索引。
底层索引器将使用 IndexManyAsync 并批量处理提供给它的枚举。
类似:
public void IndexMany(IEnumerable<IIndexModel> indexModels) {
var client = new ElasticClient(settings);
var batches = indexModels.Batch(1000);
var tasks = new List<Task>();
Parallels.ForEach(partitions, partition =>
{
var task = client.IndexManyAsync(partition);
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
}
因此,考虑到这一点,我想使用 IndexModels 创建一个可枚举。
IndexModels 将获取一个实体并通过给定实体初始化各种属性。比如:
public class FooModel<T> : IIndexModel
{
public FooModel(T entity)
{
Name = entity.Name;
}
public string Name { get; set; }
}
我有一个包含约 40 万行的表,这显然需要一些时间来查询。所以我想做的是异步执行。
我已经尝试了各种方法来做到这一点。第一种方法是批量查询并对其进行并行处理。这给 ObjectContext 带来了各种并发问题。
public void IndexAllModels() {
using (var db = new Db()) {
var batchedEntities = db.BigTable.Select(p => p).Batch(1000);
Parallels.ForEach(batchedEntities, currentBatch =>
{
var indexModels = new List<IIndexModel>();
foreach (var entity in currentBatch)
{
var indexModel = new FooModel<BigTable>(entity);
indexModels.Add(indexModel);
}
IndexMany(indexModels);
}
}
}
我想知道是否有任何方法可以通过使用新的 EF6 异步操作来做到这一点?
【问题讨论】:
-
indexModels的大小是多少? -
可能会有所不同。一些 indexmodel 设置了大约 20 个属性,而一些只有 5 个左右。
-
多达 400 万个索引模型。
-
为什么 ElasticSearch 已经通过 JDBC 连接支持 ORM 来爬取数据库?使用 ORM 并没有任何好处(不涉及 个对象),但是通过只传递数据的中介确实会增加大量开销
标签: c# .net entity-framework asynchronous async-await