C# 使用FastMember复制列表
为了提高性能,我使用FastMember和线程技术完成了列表的批量复制 实际上,我需要批量复制9999999条记录,并且我已经为每1000000条记录设置了一个间隔,并清除列表以避免OutofMemory异常 整个过程花了大约16个小时才完成,现在,我的问题是:没有插入任何记录。在这个过程中,我使用nolock读取了数据,我的查询显示了数据,有时没有显示任何记录。我认为数据一直在插入和删除 原因是,我这么说是因为:如果我现在开始插入任何记录,Identity列将以百万为单位显示一个非常大的数字。 所以,据我所知,我觉得记录被插入和删除了 我的代码:C# 使用FastMember复制列表,c#,sql,list,sqlbulkcopy,fastmember,C#,Sql,List,Sqlbulkcopy,Fastmember,为了提高性能,我使用FastMember和线程技术完成了列表的批量复制 实际上,我需要批量复制9999999条记录,并且我已经为每1000000条记录设置了一个间隔,并清除列表以避免OutofMemory异常 整个过程花了大约16个小时才完成,现在,我的问题是:没有插入任何记录。在这个过程中,我使用nolock读取了数据,我的查询显示了数据,有时没有显示任何记录。我认为数据一直在插入和删除 原因是,我这么说是因为:如果我现在开始插入任何记录,Identity列将以百万为单位显示一个非常大的数字。
private void Btn_Start_Encrypting_Click(object sender, EventArgs e)
{
try
{
Btn_Start_Encrypting.Enabled = false;
Lbl_Msg1.Text = "Time Started : " + DateTime.Now.ToString();
DateTime StartTime = DateTime.Now;
#region List<CustomClass> with Random Numbers
Random rand = new Random();
Thread previousThread = null;
for (int i = 1; i <= 999999999; i++)
{
LstEncData.Add(new EncryptedData { MESSAGE_ID = rand.Next(1, 100), ENCRYPTED_DATA = EncryptDecrypt.Encrypt(i.ToString("D9")) });
if (i % 1000000 == 0)
{
LstEncData = LstEncData.OrderBy(p => p.MESSAGE_ID).ToList();
if (previousThread != null)
{
previousThread.Join();
}
List<EncryptedData> copyList = LstEncData.ToList();
previousThread = new Thread(() => BulkCopyList(copyList));
previousThread.Start();
LstEncData.Clear();
}
}
if (LstEncData.Count > 0)
{
if (previousThread != null)
{
previousThread.Join();
}
List<EncryptedData> copyList = LstEncData.ToList();
previousThread = new Thread(() => BulkCopyList(copyList));
previousThread.Start();
LstEncData.Clear();
}
previousThread.Join();
Lbl_Msg2.Text = "Time Ended : " + DateTime.Now.ToString();
DateTime EndTime = DateTime.Now;
TimeSpan duration = EndTime - StartTime;
Lbl_Msg3.Text = "Total Time Taken in Seconds : " + duration.TotalSeconds.ToString();
#endregion
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
Btn_Start_Encrypting.Enabled = true;
}
}
public void BulkCopyList(List<EncryptedData> Lst)
{
try
{
using (var bcp = new SqlBulkCopy(System.Configuration.ConfigurationManager.AppSettings["ConnectionString"]))
{
using (var reader = ObjectReader.Create(Lst, "ENCRYPTED_DATA"))
{
SqlBulkCopyColumnMapping mapEncryData = new SqlBulkCopyColumnMapping("ENCRYPTED_DATA", "ENCRYPTED_DATA");
bcp.ColumnMappings.Add(mapEncryData);
bcp.DestinationTableName = "EncryptedData1";
bcp.WriteToServer(reader);
}
}
}
catch (Exception ex)
{
}
}
我在线程或大容量复制附近做错了什么吗?一次大容量插入一百万个对象太多了。BulkCopyList中的try-catch块中可能发生OutOfMemoryException,但正在隐藏它。更高的批量插入也不能转化为更快的总体性能。尝试使用100000。另一种可能是多线程大容量插入重叠,导致异常,因为两个线程同时访问同一个连接。@厌恶:是否有可能检查SQL是否有错误?可能类似于日志?你能确认BulkCopyList方法中没有发生异常吗?实际上,我开始尝试使用100000条记录。我不确定BulkCopyList方法是否有任何异常。我将尝试使用较少的记录并更新结果。