gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:15:22 26 4
gpt4 key购买 nike

我已经完成了 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,奥地利机械

4870,1370,盘子

0153,1900,填缝枪

0154,1900,新终结者

0360,1470,MU 186 MACCH。 X LAV。 S/A ASTE PS174

9113-H22,1970,MC钻头

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

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

提前致谢。

最佳答案

The reason you are getting OutOfMemoryException is because you are creating an in memory data table and are trying to insert 300K rows into it

要放入内存的数据量很大。

除此之外,您应该做的是从文本文件中读取一定数量的行 - 您需要将其插入到数据库中。

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

关于c# - 如何从文本文件中读取数百万行并快速插入到表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38562082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com