我已经构建了一个简单的文件解析器,它逐行读取csv文件并将其添加到数据库中。
在文件被完全解析之前,我不会对DB进行更改。
它工作正常,但出于某种原因,每个下一个文件 - 解析变得越来越慢 这里是代码,非常欢迎任何关于如何加快它的建议。
using Microsoft.VisualBasic.FileIO;
using System;
using System.IO;
namespace CsvToSQL
{
internal class Program
{
private static void Main(string[] args)
{
TransactionsEntities entities = new TransactionsEntities();
string targetFolderPath = "C:\\Transactions\\";
string[] allFiles = Directory.GetFiles(targetFolderPath);
//Loop through files in folder
foreach (var file in allFiles)
{
//parse file
Console.WriteLine(file);
using (TextFieldParser parser = new TextFieldParser(file))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
int lineNo = 0;
while (!parser.EndOfData)
{
TransactionList transaction = new TransactionList();
//processing row
string[] fields = parser.ReadFields();
try
{
if(lineNo % 20 == 0)
{
Console.WriteLine(file + " Parsed line no: " + lineNo);
}
transaction.Account = fields[0];
transaction.Timestamp = fields[1];
transaction.TransactionType = fields[2];
transaction.Status = fields[3];
transaction.Product = fields[4];
transaction.Price = fields[5];
transaction.BuySell = fields[6];
transaction.Series = fields[7];
transaction.Volume = fields[8];
transaction.FillVolume = fields[9];
transaction.OrderID = fields[10];
transaction.BestBid = fields[11];
transaction.BestAsk = fields[12];
entities.TransactionLists.Add(transaction);
lineNo++;
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
Console.ReadKey();
}
}
try
{
entities.SaveChanges();
}catch(Exception e)
{
Console.WriteLine(e.ToString());
Console.ReadKey();
}
}
}
}
}
}
答案 0 :(得分:0)
大家好我发现了内存问题 - 如果有人遇到类似的问题。
TransactionsEntities entities = new TransactionsEntities();

这正是导致它如此令人难以置信地放慢速度的原因。它使用与DB相同的连接替换为:
using (TransactionsEntities entities = new TransactionsEntities()){
//Transaciton parsing code for 1 file
}

答案 1 :(得分:0)
你的问题是:
TNAuthorizationList
由于Entity框架并非设计用于处理批量数据,因此它会将条目缓存在内存中以最大限度地减少重新查询等。但是在单个上下文中添加大量条目会使缓存数据的维护/检查速度变慢,这是您的情况。
如果您使用的是SQL Server,最好使用SQLBulkCopy。它会为您的流程增加100倍的速度。