2010-03-12 4 views
2

Я пытаюсь обработать 114 000 строк в наборе данных (заполненном из базы данных оракула). Я нахожу ошибку около отметки 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

+0

Вы используете «Async» «Делегат» или «BackgroundWorker»? У меня были проблемы с памятью при использовании делегатов «Async», наконец, для переключения BGW. Но я сомневаюсь, что 600 строк вызовут поражение памяти. – Vivek

ответ

0

Несколько мыслей:

  1. В зависимости от того, что вы делаете, DataReader может быть быстрее, чем DataTable. DataReader позволяет обрабатывать одну строку за раз, поскольку она считывается из базы данных. Если вы выполняете справедливую бит обработки в каждой строке, то ваш текущий метод (DataTable), скорее всего, будет лучшим подходом, поскольку он позволяет вывести все строки в память и обработать их, не открывая соединение.
  2. Рассмотрим «SELECT IK_DBKEY» вместо «SELECT *», так как вы будете отводить меньше данных по проводу и в память.
  3. Наконец, вы можете поставить try/catch вокруг своего кода, чтобы убедиться, что он является фактическим источником сообщения об ошибке. Если вы используете ASP.Net, «Thread был прерван», это довольно распространенная ошибка, которая обычно указывает на то, что запрос обработки был прерван (например, кто-то перемещался вдали от долговременного запроса).
+0

Спасибо, Фил. Он работает в процессе ASP.NET (веб-часть SharePoint). Я собираюсь перестроить консольное приложение, чтобы узнать, все ли у меня проблема. – Donaldinio

0

Возможно ли, что ваш SqlCommand отключен? Попробуйте поэкспериментировать с собственностью CommandTimeout, чтобы увидеть, если это возможно, причина:

com.CommandTimeout = 300; // sets a timeout to complete the command of five minutes 
0

Во-первых, уменьшить объем данных, которые вы получаете, не используя select * в запросе. Укажите, какие поля вам действительно нужны из таблицы. По крайней мере одно поле не требуется вообще, поскольку вы уже знаете, что это значение.

Вместо использования DataTable вы можете использовать DataReader. Таким образом, вы можете обрабатывать записи по одному, чтобы вам не приходилось сразу записывать всю запись в память.

Смежные вопросы