我已经经历了快速向 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 列。
有没有更快的方法来实现上述功能来读取文件并创建用于批量插入的数据表?这样我就不应该从索引异常中获取内存。
提前致谢。