我已经通过Insert 2 million rows into SQL Server quickly链接,发现我可以通过使用批量插入来完成此操作。所以我试图创建数据表(如下面的代码),而是因为这是一个巨大的文件(超过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的,AUSRICHTEN MASCHINELL
4870,1370,PLATTE STECKEN
0153,1900,填缝枪
0154,1900,新的终结者
0360,1470,MU 186 MACCH。 X LAV。 S/A ASTE PS174
9113-H22,1970,MC钻头
代码需要此转换成6行和3列。
有没有更快的方法来实现上述功能来读取文件并创建用于批量插入的数据表?所以我不应该从索引异常中获取内存。
在此先感谢。
这是否需要以编程方式完成?如果这只是一个关闭,你可以使用SSMS工具 – Mark
你可以分区吗?像读取数千行,批量插入这些数据,然后重新使用数据表为接下来的数千行等等。 – dlatikay
是的,它需要,因为我有更多的代码来根据env从不同的服务器获取文件。 (DEV,TST,PROD)。并有更多的功能。 – Rocky