列表<系统.数据行>与列表<EntityClass>,哪个会更快?



我正在从数据库中加载大约 400 万条记录,并一次处理一行。为此,我正在迭代数据集的每个数据行,这导致了效率问题。

我怎样才能使它更快?我尝试使用Parallel.Foreach循环。但是,由于我正在处理的数据行不是线程安全的,因此在我写入数据行的位置周围实施锁定块会降低效率。逻辑长度约为 3k 行。所以每一行都通过 3k 行运行。

有没有办法提高效率?我正在考虑使用DataRows列表而不是使用DataRows本身。如果我进行此更改,我是否能够使用 Parallel.Foreach 循环并期望获得更高的效率?

还是应该为报表创建一个实体类并创建该实体类的列表?哪一个会更快?System.DataRow 列表还是实体类列表?

我确实理解这是一个设计问题,但在这方面我无能为力。我将不胜感激任何形式的帮助。谢谢。

我建议使用数据阅读器一次处理一行,而不是将 400 万行加载到数据表中。这应该大大加快加载过程。

若要加快处理速度,可以将 C# 3000 行代码设置为异步方法,为每一行调用该方法。使用 Task.WhenAll 并行运行它们。您可以System.Net.ServicePointManager.DefaultConnectionLimit以最大化并行度。

这是它可能看起来像什么

public async Task LoadData(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT colOne, colTwo, colThree FROM SqlTable;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
var tasks = new List<Task>();
if (reader.HasRows)
{
while (reader.Read())
{
tasks.Add(ProcessData(reader.GetInt32(0), reader.GetInt32(1), reader.GetInt32(2)));
}
await Task.WhenAll(tasks);
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
}
public async Task ProcessData(int one, int two, int three)
{ 
// lots of processing
// open a new connection to database to update row and close it.
}

希望有帮助。

DataTables "对于多线程读取操作是安全的。您必须同步任何写入操作。

https://learn.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netcore-3.1

但是,如果您可以避免将 4M 行加载到数据表中,那就更好了。 如果可以获取按数据库排序的结果,则可以在最初加载数据时有效地执行分组。

最新更新