Я прошел через быстро вставить 2 миллиона строк в SQL Server ссылка и обнаружил, что я могу сделать это с помощью массовой вставки. Итак, я пытаюсь создать таблицу данных (код, как показано ниже), но, поскольку это огромный файл (более 300 КБ строк), я получаю OutOfMemoryEexception
в своем коде:
string line;
DataTable data = new DataTable();
string[] columns = null;
bool isInserted = false;
using (TextReader tr = new StreamReader(_fileName, Encoding.Default))
{
if (columns == null)
{
line = tr.ReadLine();
columns = line.Split(',');
}
for (int iColCount = 0; iColCount < columns.Count(); iColCount++)
{
data.Columns.Add("Column" + iColCount, typeof(string));
}
string[] columnVal;
while ((line = tr.ReadLine()) != null)
{
columnVal = line.Split(','); // OutOfMemoryException throwing in this line
data.Rows.Add(columnVal);
}
}
после долгой работы я изменил свой код, как показано ниже, но также я получаю OutOfMemoryException во время добавления строк в таблицу данных
DataTable data = new DataTable();
string[] columns = null;
var line = string.Empty;
using (TextReader tr = new StreamReader(_fileName, Encoding.Default))
{
if (columns == null)
{
line = tr.ReadLine();
columns = line.Split(',');
}
for (int iColCount = 0; iColCount < columns.Count(); iColCount++)
{
data.Columns.Add("Column" + iColCount, typeof(string));
}
}
// Split the rows in 20000 rows in different list
var _fileList = File.ReadLines(_fileName, Encoding.Default).ToList();
var splitChunks = new List<List<string>>();
splitChunks = SplitFile(_fileList, 20000);
Parallel.ForEach(splitChunks, lstChunks =>
{
foreach (var rows in lstChunks)
{
string[] lineFields = rows.Split(',');
DataRow row = datatbl.NewRow();
for (int iCount = 0; iCount < lineFields.Count(); iCount++)
{
row[iCount] = lineFields[iCount] == string.Empty ? "" : lineFields[iCount].ToString();
}
datatbl.Rows.Add(row);
}
});
Я могу сделать массовую вставку для следующего уровня, как показано ниже:
SqlConnection SqlConnectionObj = GetSQLConnection();
SqlBulkCopy bulkCopy = new SqlBulkCopy(SqlConnectionObj, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.UseInternalTransaction, null);
bulkCopy.DestinationTableName = "TempTable";
bulkCopy.WriteToServer(data);
Файл содержит следующие данные
4714,1370,АУСРИХТЕН МАШИНЕЛЛ
4870,1370,ПЛАТА ШТЕНКА
0153,1900,ПИСТОЛЕТ ДЛЯ ЗАЧАТКИ
0154,1900,НОВЫЙ ТЕРМИНАТОР
0360,1470,МУ 186 МАЧ. Х ЛАВ. S/A АСТЭ PS174
9113-H22,1970,БУРОВЫЕ ДОЛОТА MC
Код должен преобразовать это в 6 строк и 3 столбца.
Есть ли более быстрый способ реализовать вышеуказанные функции для чтения файла и создания таблицы данных для массовой вставки? Так что я не должен получить память из исключения индекса.
Заранее спасибо.