“线程被中止”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; 

    } 
+0

让我问....是不是一个内存问题? – Luiscencio 2010-03-12 22:11:16

+0

你在使用'异步''委托'或'BackgroundWorker'吗?使用“异步”代表时,我遇到了一些内存问题,最终导致切换BGW。但我怀疑600行会导致记忆击中。 – Vivek 2010-03-13 00:15:02

的一点想法:

  1. 取决于你在做什么,一个DataReader可能比一个DataTable更快。 DataReader允许您从数据库读取数据时一次处理一行数据。如果你在每一行都做了相当一部分的处理,那么你当前的方法(一个DataTable)可能是更好的方法,因为它允许你将所有行拖入内存并处理它们而不会保持连接打开。
  2. 考虑“SELECT IK_DBKEY”而不是“SELECT *”,因为您将通过连线和内存拉回更少的数据。
  3. 最后,您可能会在代码中加入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。这样,您可以逐个处理记录,以便您不必一次将所有记录存入内存。