我已經通過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