gpt4 book ai didi

c# - 并行遍历多个大型数据集

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:35 25 4
gpt4 key购买 nike

我正在开发一个应用程序,它需要使用存储过程从 sql server 数据库获取源数据,进行一些计算并使用另一个存储过程将结果存储回 sql server。总源数据约为 10.000.000 条记录,可分为 100 个不同的数据集。因此,在我能够使用迭代数据读取器(耗时 50 多个小时)按顺序执行完整的过程之后,我现在正在寻找一种解决方案来并行化该过程,以便我可以同时运行 8 次计算(我正在使用具有 2 个四核的服务器处理器)。我尝试了使用 EF6 的示例,但最终遇到了问题,因为 EF 不是线程安全的。即使是隔离每个上下文的解决方案也行不通。通过使用

using (var ctx = new MyEntities()) 
{
var resGuid = ReserveGroupId(pIdForCalc, ctx);
int pageNumber = 0;
int pageSize = 200;
bool DataNotComplete = true;
while (DataNotComplete)
{
List<GetNextCalcDataSetPaged_Result> lstCalcDataSet = GetDataPaged ((pIdForCalc,pageNumber,pageSize,ctx);
if (lstCalcDataSet != null)
{
DataNotComplete = lstCalcDataSet.Count == pageSize;
Parallel.ForEach(lstCalcDataSet, CalcDataRecord =>
{ if (ctx != null) CalcBundelSetParallel(CalcDataRecord, ctx); });
}
pageNumber++;
}

最佳答案

一种肮脏的方法是使用充满断开连接数据 block 的断开连接数据集,例如,一次有 200,000 条记录。一旦进入内存,您就可以像这样并行处理它

//Setup empty dataset for results setting its schema
dsResultSet.Tables.Add(ORM.GetDataSet("MyDataToProcess").Tables[0].Clone());

object key = new object();

//Iterate in parallel your Dataset
Parallel.ForEach(ORM.GetDataSet("MyDataToProcess").Tables[0].AsEnumerable(), drow =>
{
if (((string)drow["DataRecordKey"]).Contains(SomeKey))
{
//some process with the record
//...

lock (key)
{
//Add the result to other disconnected DataSet
dsResultSet.Tables[0].BeginLoadData();
dsResultSet.Tables[0].Rows.Add(drow.ItemArray);
dsResultSet.Tables[0].EndLoadData();
}
}

});`

我知道,它与 Entity Framework 代码不太一样,但这段代码对我有用,可以在毫秒内对内存中的 200,000 条记录进行操作。结果的第二个表的原因是 DataTables 对于更新不是线程安全的,只是为了读取。

关于c# - 并行遍历多个大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20329088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com