gpt4 book ai didi

.net - 有没有办法加快读取数据的速度?

转载 作者:行者123 更新时间:2023-11-29 12:34:04 25 4
gpt4 key购买 nike

在程序中,我创建了以下逻辑,用于从数据库中读取数据并将其存储到 List<>:

                NpgsqlCommand cmd = new NpgsqlCommand(query, conn);
List<UserInfo> result = new List<UserInfo>();
Npgsql.NpgsqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
string userId = rdr[0].ToString();
string sex = rdr[1].ToString();
string strDateBirth = rdr[2].ToString();
string zip = rdr[3].ToString();

UserInfo userInfo = new UserInfo();
userInfo.Msisdn = userId;
userInfo.Gender = sex;
try
{
userInfo.BirthDate = Convert.ToDateTime(strDateBirth);
}
catch (Exception ex)
{
}
userInfo.ZipCode = zip;
userInfo.DemographicsKnown = true;
userInfo.AgeGroup = getAgeGroup(strDateBirth);
if (result.Count(x => x.Id== userId) == 0)
result.Add(userInfo);
}

这段代码的性能真的很差。有超过 2M 的记录,半小时后列表 userInfo 仅包含 300.000 条记录。

有谁知道如何加快从数据库中读取数据的速度?

最佳答案

当你真正的意思是 .Any()
你正在使用 .Count每当您调用 .Count 时,您都在枚举整个集合,只是为了查看是否有一个匹配....

考虑一下您要问的问题:
“你有多少行符合这个条件?那个数字等于零吗?”

你真正的意思是:
“是否有任何行符合此条件?”

在这种情况下,您可以创建 userId 值的哈希集。在哈希集(或字典)中检查是否存在比在列表中检查相同内容要快得多。

此外,如果您确实已经有了userId,那么您就无缘无故地解析并读取了所有值。首先检查 myHashset.Contains(userId),然后添加。

这是它运行缓慢的主要原因。对于 n 行,您正在执行集合的第 n 个三角形枚举!

编辑: 考虑这个未经测试的更改:我不知道您的阅读器是否支持类型化的读取方法,例如 GetString(),所以如果不支持,那么只需使用什么你以前有过。

NpgsqlCommand cmd = new NpgsqlCommand(query, conn);
List<UserInfo> result = new List<UserInfo>();
Npgsql.NpgsqlDataReader rdr = cmd.ExecuteReader();
HashSet<string> userHash = new HashSet<string>(); // is this actually an int?

while (rdr.Read())
{
string userId = rdr.GetString(0);
If (!userHash.Contains(userId))
{
string strDateBirth = rdrGetString(2);
UserInfo userInfo = new UserInfo();
userInfo.Msisdn = userId;
userInfo.Gender = rdr.GetString(1);
datetime parseddate; // this is not used if the parse fails
if (Datetime.TryParse(strDateBirth, out parseddate))
{
userInfo.BirthDate = parseddate;
// userInfo.AgeGroup = getAgeGroup(strDateBirth); // why take the string?
// rewrite your getAgeGroup method to take the datetime
userInfo.AgeGroup = getAgeGroup(parseddate);
}
userInfo.ZipCode = rdr.GetString(3);
userInfo.DemographicsKnown = true;
result.Add(userInfo);
userHash.Add(userId);
}
}

这将始终保留您找到的用户行的第一个 实例(这是您当前代码所做的)。如果您想保留 last 实例,则可以使用字典并完全消除 .Contains() 调用。

编辑:我只是注意到我的示例从未将 userId 添加到哈希中...哎呀...将其添加到那里。

关于.net - 有没有办法加快读取数据的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10984059/

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