我想要做的是從大約400萬行的表中獲取行,以便將其與ElasticSearch建立索引。從EF6數據庫中選擇大量數據異步
基礎索引器將使用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; }
}
我有一個包含~4mil行的表,這顯然需要一些時間來查詢。所以我想要做的就是做這個異步。
我已經嘗試過這樣做的各種方法。第一種方法是對查詢進行批量處理,並對其進行相似處理。這給了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 2015-02-12 09:45:41
可能會有所不同。一些indexmodels設置約20個屬性,一些只有5個左右。 – Ekenstein 2015-02-12 11:13:39
我的意思是有多少... – i3arnon 2015-02-12 11:15:44