Я столкнулся с исключениями OutOfMemory при попытке загрузить текстовый файл объемом 800 МБ в DataTable через StreamReader.Мне было интересно, есть ли способ загрузить DataTable из потока памяти в пакетном режиме, то есть прочитать первые 10000 строк текстового файла из StreamReader, создать DataTable, сделать что-то с DataTable, затем загрузить следующие 10000 строк в StreamReader искоро.
Мои Google не очень помогли, но, похоже, для этого должен быть простой способ.В конечном итоге я буду записывать DataTables в базу данных MS SQL с использованием SqlBulkCopy, поэтому, если есть более простой подход, чем тот, который я описал, я был бы благодарен за быстрый указатель в правильном направлении.
Правка - Воткод, который я запускаю:
public static DataTable PopulateDataTableFromText(DataTable dt, string txtSource)
{
StreamReader sr = new StreamReader(txtSource);
DataRow dr;
int dtCount = dt.Columns.Count;
string input;
int i = 0;
while ((input = sr.ReadLine()) != null)
{
try
{
string[] stringRows = input.Split(new char[] { '\t' });
dr = dt.NewRow();
for (int a = 0; a < dtCount; a++)
{
string dataType = dt.Columns[a].DataType.ToString();
if (stringRows[a] == "" && (dataType == "System.Int32" || dataType == "System.Int64"))
{
stringRows[a] = "0";
}
dr[a] = Convert.ChangeType(stringRows[a], dt.Columns[a].DataType);
}
dt.Rows.Add(dr);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
i++;
}
return dt;
}
И вот возвращаемая ошибка:
«System.OutOfMemoryException: исключение типа« System.OutOfMemoryException »было сгенерировано.
в System.String.Split (разделитель Char [], число Int32, параметры StringSplitOptions)
в System.String.Split (разделитель Char []}
в Harvester.Config.PopulateDataTableFromText (DataTable dt, StringtxtSource) в C: .... "
Что касается предложения загружать данные непосредственно в SQL - я немного новичок, когда дело доходит до C #, но я подумал, что это в основном то, чтоЯ делаю? SqlBulkCopy.WriteToServer берет DataTable, который я создаю, из текстового файла и импортирует его в sql. Есть ли еще более простой способ сделать это, что мне не хватает?
Edit: О, я забыл упомянуть - этот код не будет работать на том же сервере, что и SQL Server.Текстовый файл данных находится на сервере B и должен быть записан в таблицу на сервере A. Это исключает использование bcp?