我有一个sync方法,用于比较Web服务中的项目列表,并同步数据库中的本地副本。
这段代码可以正常运行,但我觉得可以优化它。我们正在处理200,000个项目,每个项目有10-15个相关表格,所以这不是一个小工作量,但通常需要大约30-60分钟才能完成(如果有更多的项目比通常更多,则更多)。它适当地使用了所有核心,没有问题。
此代码删除已删除的项目。
var updatedListings = await _listingFeedService.GetListingsAsync();
Object lockContext = new Object();
var counter = 0; //Save changes every 300 listings
var parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount - 1
};
//1.- Delete sold listings
var soldListings = _listingRepo.GetSoldListings(updatedListings);
Parallel.ForEach(soldListings, parallelOptions, (sl) =>
{
try
{
lock (lockContext)
{
_listingRepo.DeleteByMlsId(sl);
counter++;
if (counter > 100)
{
_listingRepo.Save();
counter = 0;
}
}
}
catch (Exception e)
{
syncReport.AppendLine($"{System.DateTime.Now} - ListingId: {sl} Status:Error | Error: { e.Message}");
}
});
_listingRepo.Save();
此代码插入新项目
//3.- Save the new listings
var newListings = _listingRepo.GetNewListings(updatedListings);
counter = 0;
Parallel.ForEach(newListings, parallelOptions, newListingMlsId =>
{
try
{
Listing listingToUpdate;
listingToUpdate = _listingFeedService.GetListingByMlsIdAsync(newListingMlsId).Result;
lock (lockContext)
{
_listingRepo.Add(listingToUpdate);
if (listingToUpdate.MlsId != 0)
{
counter++;
if (counter > 50)
{
_listingRepo.Save();
counter = 0;
}
}
}
}
catch (Exception e)
{
syncReport.AppendLine($"{System.DateTime.Now} - ListingId: {newListingMlsId} Status:Error | Error: { e.Message}");
}
});
_listingRepo.Save();