每个下一个文件

时间:2017-03-29 07:50:14

标签: c# sql parsing

我已经构建了一个简单的文件解析器,它逐行读取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();
                    }



                }


            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

大家好我发现了内存问题 - 如果有人遇到类似的问题。



 TransactionsEntities entities = new TransactionsEntities();




这正是导致它如此令人难以置信地放慢速度的原因。它使用与DB相同的连接替换为:



 using (TransactionsEntities entities = new TransactionsEntities()){
 //Transaciton parsing code for 1 file
 }



 并且应用程序以100倍速度飞过文件:)

答案 1 :(得分:0)

你的问题是:

TNAuthorizationList

由于Entity框架并非设计用于处理批量数据,因此它会将条目缓存在内存中以最大限度地减少重新查询等。但是在单个上下文中添加大量条目会使缓存数据的维护/检查速度变慢,这是您的情况。

如果您使用的是SQL Server,最好使用SQLBulkCopy。它会为您的流程增加100倍的速度。