gpt4 book ai didi

C# 非常快速地从文本文件添加数千行到数据库

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:00 26 4
gpt4 key购买 nike

我正在为 Grepolis 创建一个应用程序,这是一款在线 war 游戏,您可以在其中与成千上万的其他玩家一起玩。我正在连接到位于 http://en12.grepolis.com/data/players.txt 的文本文件并将其下载到 WebClient.DownloadString。然后我在“\n”上拆分它,并在“,”上拆分每个字符串。每行包含玩家 id、名称、alliance_id、点数、等级和城镇(玩家拥有的城镇数)。最后一次统计有超过 60000 个。我在大约 10 分钟内将它们全部上传到本地数据库,现在对每一行进行更新,以便在此过程中删除所有得分为 0 的玩家,并更新自上次更新以来发生变化的所有玩家。问题是到目前为止,即使只是更新也需要 10 多分钟。

有什么真正快速的方法可以完成我想做的事情吗?这是我认为相关的所有代码:

文件:Global.asax.cs

protected void Application_Start(object sender, EventArgs e)
{
WebClient wc = new WebClient();
String str = wc.DownloadString("http://en12.grepolis.com/data/players.txt");
String[] players = str.Split('\n');
foreach (String player in players)
{
String[] playerInfo = player.Split(',');
ContentManager cm = new ContentManager();
int id = 0;
String name = "";
int alliance_id = 0;
int points = 0;
int rank = 0;
int towns = 0;
try
{
int.Parse(playerInfo[0]);
id = int.Parse(playerInfo[0]);
}
catch
{
}
try
{
name = playerInfo[1];
}
catch
{
}
try
{
int.Parse(playerInfo[2]);
alliance_id = int.Parse(playerInfo[2]);
}
catch
{
}
try
{
int.Parse(playerInfo[3]);
points = int.Parse(playerInfo[3]);
}
catch
{
}
try
{
int.Parse(playerInfo[4]);
rank = int.Parse(playerInfo[4]);
}
catch
{
}
try
{
int.Parse(playerInfo[5]);
towns = int.Parse(playerInfo[5]);
}
catch
{
}
if (points > 0 && towns > 0 && id > 0 && !name.Equals(""))
{
try
{
cm.UpdatePlayer(id, name, alliance_id, points, rank, towns);
}
catch
{
}
}
else
{
try
{
cm.DeletePlayer(id);
}
catch
{
}
}
}
}

文件:ContentManager.cs

public class ContentManager : IHttpModule
{
SqlDataSource conn = new SqlDataSource(WebConfigurationManager.ConnectionStrings["DevConn"].ConnectionString, "");
public void UpdatePlayer(int id, String name, int alliance_id, int points, int rank, int towns) {
conn.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure;
conn.UpdateCommand = "UpdatePlayer";
conn.UpdateParameters.Clear();
conn.UpdateParameters.Add("id", id.ToString());
conn.UpdateParameters.Add("name", name);
conn.UpdateParameters.Add("alliance_id", alliance_id.ToString());
conn.UpdateParameters.Add("points", points.ToString());
conn.UpdateParameters.Add("rank", rank.ToString());
conn.UpdateParameters.Add("towns", towns.ToString());
conn.Update();
}

public void DeletePlayer(int id)
{
conn.DeleteCommandType = SqlDataSourceCommandType.StoredProcedure;
conn.DeleteCommand = "DeletePlayer";
conn.DeleteParameters.Clear();
conn.DeleteParameters.Add("id", id.ToString());
conn.Delete();
}
}

最佳答案

您一次处理一个播放器,您需要进行批量上传。

您需要在 FOR 循环中处理所有用户,然后执行“批量插入”。

在我这里的工作中,我可以以我的 HD 可以读取的速度批量插入。

警告,批量插入会锁定表,因此如果您计划在导入期间让表完全可读,则可能必须为批量插入设置批处理。

例如:10 万行,1 万个批处理。1)锁表2) 开始导入直到 10k 行3)解锁表4) 如果要提交更多行,转到 1

在第 3 步和第 4 步之间,会有一个中断,其他查询可能会针对该表运行。

SQL 和 .NET 管理几乎所有这些,我只是为您分解了逻辑。您需要做的就是阅读有关批量插入和批处理的知识,一旦您掌握了这些内容,这似乎真的很容易。

关于C# 非常快速地从文本文件添加数千行到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5006615/

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