C#非常快速地将数千行从文本文件添加到数据库
我正在为Grepolis创建一个应用程序,这是一款在线战争游戏,你可以和成千上万的其他玩家一起玩。我正在连接到位于的文本文件,并将其下载到WebClient.DownloadString。然后我在“\n”上拆分这个字符串,并在“,”上拆分每个字符串。每行包含玩家id、姓名、联盟id、积分、等级和城镇(玩家拥有的城镇数量)。上次清点时有6万多人。我在大约10分钟内将他们全部上传到本地数据库,现在对每一行进行更新,以便在此过程中删除所有得分为0的玩家,并更新自上次更新以来发生变化的玩家。问题是,到目前为止,即使只是更新也要花费10分钟以上的时间 有没有什么快速的方法来完成我想做的事情?以下是我认为相关的所有代码: 文件:Global.asax.csC#非常快速地将数千行从文本文件添加到数据库,c#,sql-server,sql-server-2008,web-applications,webforms,C#,Sql Server,Sql Server 2008,Web Applications,Webforms,我正在为Grepolis创建一个应用程序,这是一款在线战争游戏,你可以和成千上万的其他玩家一起玩。我正在连接到位于的文本文件,并将其下载到WebClient.DownloadString。然后我在“\n”上拆分这个字符串,并在“,”上拆分每个字符串。每行包含玩家id、姓名、联盟id、积分、等级和城镇(玩家拥有的城镇数量)。上次清点时有6万多人。我在大约10分钟内将他们全部上传到本地数据库,现在对每一行进行更新,以便在此过程中删除所有得分为0的玩家,并更新自上次更新以来发生变化的玩家。问题是,到目
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循环中的所有用户,然后执行“批量插入” 在我这里的工作,我可以批量插入的速度,我的硬盘可以读取 警告,大容量插入会锁定表,因此,如果您计划在导入期间使表完全可读,则可能必须为大容量插入设置批次 例如:10万行,10万批。 1) 锁台 2) 开始导入到10k行 3) 解锁表 4) 如果要提交更多行,请转到1 在步骤3和步骤4之间,会有一个中断,其他查询可能会在该表上运行
SQL和.NET几乎管理了所有这些,我刚刚为您解释了逻辑。你所需要做的就是阅读批量插入和批处理,一旦你得到它,这看起来非常容易。你一次只处理一个播放器,你需要批量上传 您需要处理FOR循环中的所有用户,然后执行“批量插入” 在我这里的工作,我可以批量插入的速度,我的硬盘可以读取 警告,大容量插入会锁定表,因此,如果您计划在导入期间使表完全可读,则可能必须为大容量插入设置批次 例如:10万行,10万批。 1) 锁台 2) 开始导入到10k行 3) 解锁表 4) 如果要提交更多行,请转到1 在步骤3和步骤4之间,会有一个中断,其他查询可能会在该表上运行
SQL和.NET几乎管理了所有这些,我刚刚为您解释了逻辑。你所需要做的就是阅读批量插入和批处理,一旦你得到它,这看起来真的很容易。过去每当我必须这样做时,我都会将数据输出到一个临时文本文件,然后用于将数据转储到数据库中。过去每当我必须这样做时,我都会将数据输出到一个临时文本文件,然后用于将数据转储到数据库中。谢谢你。我试图使用它,但我使用变量设置文件名(通过参数输入更新过程)。我正在使用Server.MapPath(“/App\u Data/players.txt”),但它在“C:”上抛出了一个错误。我认为是冒号引起了这个问题。已经尝试过URL和HTML编码,但没有效果。知道是什么原因吗?路径是相对于SQL server的,因此只有当应用程序盒和SQL盒共享同一个C驱动器时才能工作。谢谢。我试图使用它,但我使用变量设置文件名(通过参数输入更新过程)。我正在使用Server.MapPath(“/App\u Data/players.txt”),但它在“C:”上抛出了一个错误。我认为是冒号引起了这个问题。已经尝试过URL和HTML编码,但没有效果。知道是什么原因吗?路径是相对于SQL server的,因此只有当应用程序盒和SQL盒共享同一个C驱动器时,该路径才会工作。