如何从文本文件中读取数百万行并快速插入表中

2023-12-07

我已经经历了快速向 SQL Server 插入 200 万行链接并发现我可以通过使用批量插入来做到这一点。所以我试图创建数据表(代码如下),但由于这是一个巨大的文件(超过 300K 行),我得到一个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,MU 186 MACCH。 X LAV。 S/A ASTE PS174

9113-H22,1970,MC 钻头

代码需要将其转换为 6 行 3 列。

有没有更快的方法来实现上述功能来读取文件并创建用于批量插入的数据表?这样我就不应该从索引异常中获取内存。

提前致谢。


你得到的原因OutOfMemoryException是因为你是 创建内存数据表并尝试插入 300K 行 进去

这是要放入内存的大量数据。

相反,您应该做的是从文本文件中读取的每一定数量的行 - 您需要将其插入数据库中。

如何操作取决于您,您可以使用 SQL 或批量复制 - 但请记住,您无法读取整个文本文件并将其保存在内存中,因此请分块进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从文本文件中读取数百万行并快速插入表中 的相关文章

随机推荐