C# 大数据集上的“线程正在中止”
我正在尝试处理从oracle数据库填充的数据集中的114000行。我在大约600马克处遇到一个错误-线程被中止。 我所做的只是读取数据集,但我仍然抓住了这个问题。对于数据集来说,这是否太多数据?不过,它似乎加载到数据集中了。我欢迎任何更好的方法来处理这一数量的数据C# 大数据集上的“线程正在中止”,c#,database,C#,Database,我正在尝试处理从oracle数据库填充的数据集中的114000行。我在大约600马克处遇到一个错误-线程被中止。 我所做的只是读取数据集,但我仍然抓住了这个问题。对于数据集来说,这是否太多数据?不过,它似乎加载到数据集中了。我欢迎任何更好的方法来处理这一数量的数据 rootTermsTable = entKw.GetRootKeywordsByCategory(catID); for (int k = 0; k < rootTermsTable.Rows.Count; k++) {
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;
}
您的SqlCommand是否可能超时?尝试使用CommandTimeout属性查看这是否可能是原因:
com.CommandTimeout = 300; // sets a timeout to complete the command of five minutes
您的SqlCommand是否可能超时?尝试使用CommandTimeout属性查看这是否可能是原因:
com.CommandTimeout = 300; // sets a timeout to complete the command of five minutes
首先,通过在查询中不使用select*来减少获得的数据量。指定表中实际需要的字段。至少不需要一个字段,因为您已经知道它的值
您可以使用DataReader,而不是使用DataTable。这样,您就可以逐个处理记录,这样就不必一次将所有记录存入内存。首先,通过在查询中不使用select*来减少数据量。指定表中实际需要的字段。至少不需要一个字段,因为您已经知道它的值 您可以使用DataReader,而不是使用DataTable。这样,您就可以逐个处理记录,这样您就不必一次将所有记录存入内存。一些想法: 根据您的操作,DataReader可能比DataTable快。DataReader允许您在从数据库读取数据时一次处理一行。如果您正在对每一行进行相当多的处理,那么您当前的方法DataTable可能是更好的方法,因为它允许您将所有行拉入内存并处理它们,而无需保持连接打开。 考虑选择IKYBDKEY,而不是选择*,因为您将通过导线拉回较少的数据并进入内存。 最后,您可以在代码周围放置try/catch,以确保它是错误消息的实际来源。如果您使用的是ASP.Net,线程被中止是一个非常常见的错误,它通常表示处理请求被中断,例如,有人导航远离长时间运行的请求。 一些想法: 根据您的操作,DataReader可能比DataTable快。DataReader允许您在从数据库读取数据时一次处理一行。如果您正在对每一行进行相当多的处理,那么您当前的方法DataTable可能是更好的方法,因为它允许您将所有行拉入内存并处理它们,而无需保持连接打开。 考虑选择IKYBDKEY,而不是选择*,因为您将通过导线拉回较少的数据并进入内存。 最后,您可以在代码周围放置try/catch,以确保它是错误消息的实际来源。如果您使用的是ASP.Net,线程被中止是一个非常常见的错误,它通常表示处理请求被中断,例如,有人导航远离长时间运行的请求。
让我问一下。。。。这不是内存问题吗?您使用的是“异步”委托还是“BackgroundWorker”?我在使用“异步”委托时遇到了一些内存问题,最终切换到了BGW。但我怀疑600行是否会导致记忆受损。让我问一下。。。。这不是内存问题吗?您使用的是“异步”委托还是“BackgroundWorker”?我在使用“异步”委托时遇到了一些内存问题,最终切换到了BGW。但我怀疑600行是否会导致记忆受损。谢谢菲尔。它正在ASP.NET进程SharePoint web部件中运行。我要重建为控制台应用程序,看看我是否仍然得到这个问题。谢谢菲尔。它正在ASP.NET进程SharePoint web部件中运行。我要重建为控制台应用程序,看看我是否仍然得到的问题。