我想做的是从一张大约有四百万行的表中获取数据,将其与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; }
}
我有一个包含大约4百万行记录的表格,查询肯定需要一些时间。因此,我希望能够异步地进行查询。
我已经尝试了多种方法。首先是将查询分批,并在其上执行并行循环,但这会引发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
的大小是多少? - i3arnon