“线程被中止”0n大数据集
问题描述:
我正在尝试在数据集中处理114,000行(从Oracle数据库填充)。我在600分左右发生错误 - “线程正在中止”。
我所做的只是读取数据集,而我仍然遇到问题。这是一个数据集的数据太多吗?它似乎加载到数据集确定。我欢迎任何更好的方式来处理这些数据。“线程被中止”0n大数据集
rootTermsTable = entKw.GetRootKeywordsByCategory(catID);
for (int k = 0; k < rootTermsTable.Rows.Count; k++)
{
string keywordID = rootTermsTable.Rows[k]["IK_DBKEY"].ToString();
...
}
public DataTable GetKeywordsByCategory(string categoryID)
{
DbProviderFactory provider = DbProviderFactories.GetFactory(connectionProvider);
DbConnection con = provider.CreateConnection();
con.ConnectionString = connectionString;
DbCommand com = provider.CreateCommand();
com.Connection = con;
com.CommandText = string.Format("Select * From icm_keyword WHERE (IK_IC_DBKEY = {0})",categoryID);
com.CommandType = CommandType.Text;
DataSet ds = new DataSet();
DbDataAdapter ad = provider.CreateDataAdapter();
ad.SelectCommand = com;
con.Open();
ad.Fill(ds);
con.Close();
DataTable dt = new DataTable();
dt = ds.Tables[0];
return dt;
//return ds.Tables[0].DefaultView;
}
答
的一点想法:
- 取决于你在做什么,一个DataReader可能比一个DataTable更快。 DataReader允许您从数据库读取数据时一次处理一行数据。如果你在每一行都做了相当一部分的处理,那么你当前的方法(一个DataTable)可能是更好的方法,因为它允许你将所有行拖入内存并处理它们而不会保持连接打开。
- 考虑“SELECT IK_DBKEY”而不是“SELECT *”,因为您将通过连线和内存拉回更少的数据。
- 最后,您可能会在代码中加入try/catch,以确保它是错误消息的实际来源。如果您使用的是ASP.Net,“线程被中止”是一个非常常见的错误,通常表示处理请求被中断(例如,有人远离长时间运行的请求导航)。
+0
谢谢菲尔。它运行在ASP.NET进程(SharePoint Web部件)中。我将重建为控制台应用程序,以查看我是否仍然遇到问题。 – Donaldinio 2010-03-15 15:23:03
答
您的SqlCommand可能超时?尝试用CommandTimeout属性打转转,看看是否是可能的原因:
com.CommandTimeout = 300; // sets a timeout to complete the command of five minutes
答
首先,减少数据的,你通过在查询不使用select *
得到的金额。从表中指定您实际需要的字段。至少有一个领域根本就不需要,因为你已经知道它是有价值的。
除了使用DataTable
以外,您可以使用DataReader
。这样,您可以逐个处理记录,以便您不必一次将所有记录存入内存。
让我问....是不是一个内存问题? – Luiscencio 2010-03-12 22:11:16
你在使用'异步''委托'或'BackgroundWorker'吗?使用“异步”代表时,我遇到了一些内存问题,最终导致切换BGW。但我怀疑600行会导致记忆击中。 – Vivek 2010-03-13 00:15:02