Проблемы взаимоблокировки при преобразовании основной массы записей из DBF в CSV
Привет, я пытаюсь преобразовать visual box из DBF-файла в CSV-файл с помощью приложения visual studio 2008 c# windows. Я успешно подключаюсь к visual foxpro и читаю файл.Я использовал oledbdataadapter для заполнения набора данных, я потерпел неудачу здесь с проблемой взаимоблокировки, потому что я работаю около 800000+ записей. Поэтому я иду с oledbdatareader, читаю каждую строку и записываю в csv-файл. Он работает нормально, но после написания 400000+ записей я снова столкнулся с тупиковой проблемой. Мне нужно записать все 800000 + записей в один CSV-файл. Я приложил сюда свой код. Пожалуйста, помогите записать 800000 + записей в один CSV-файл .
OleDbCommand oleDbCommand = new OleDbCommand(query, oleDbConnection); oleDbCommand.CommandTimeout = 60000; using (OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader()) { using (streamWriter1) { int fieldCount = oleDbDataReader.FieldCount; string columns = string.Empty; StringBuilder fullFile = new StringBuilder(); for (int i = 0; i < fieldCount; i++) { columns += oleDbDataReader.GetName(i); if (i != fieldCount - 1) { columns += ","; } } fullFile.Append(columns); fullFile.Append("\r\n"); streamWriter1.Write(fullFile.ToString()); int j = 0; while (oleDbDataReader.Read()) { j++; string rows = string.Empty; for (int i = 0; i < fieldCount; i++) { rows += oleDbDataReader.GetValue(i).ToString().Trim(); rows += i != fieldCount - 1 ? "," : ""; } fullFile = new StringBuilder(); fullFile.Append(rows); fullFile.Append("\r\n"); streamWriter1.Write(fullFile.ToString()); } } oleDbDataReader.Close(); oleDbCommand.Dispose(); oleDbConnection.Close(); }
Что я уже пробовал:
Я попытался записать каждые 200000 записей в другой файл. Но эта логика также потерпела неудачу с тупиковыми проблемами после записи 400000 записей.
Richard MacCutchan
Что вы подразумеваете под"тупиком"? Что же происходит на самом деле?
sankarisiva
Я получаю сообщение об ошибке типа «CLR не удалось перейти из COM-контекста 0x50aea88 в COM-контекст 0x50aebf8 в течение 60 секунд. Поток, которому принадлежит целевой контекст / квартира, скорее всего, либо выполняет ожидание без перекачки, либо обрабатывает очень долгое время. работа без перекачки сообщений Windows. Эта ситуация обычно отрицательно сказывается на производительности и может даже привести к тому, что приложение перестает отвечать или использование памяти постоянно накапливается с течением времени. Чтобы избежать этой проблемы, все потоки однопоточного подразделения (STA) должны использовать примитивы ожидания перекачки (например, CoWaitForMultipleHandles) и регулярно перекачивают сообщения во время длительных операций ".
Richard MacCutchan
Сколько записей вы пытаетесь прочитать в вашем OleDbDataReader за один раз?
sankarisiva
Всего 800000 + записей. Зацикливая oleDbDataReader, я читаю одну запись за раз и записываю эту запись в CSV-файл.
Richard MacCutchan
Это слишком много, вам нужно разбить его на управляемые куски по несколько сотен за раз.
sankarisiva
У меня есть один файл DBF. можете ли вы помочь разбить этот файл на небольшие куски или написать запрос на чтение нескольких сотен строк за раз? Мой текущий запрос - " Select * from instable. dbf"