在读取文本文件,解析行和添加到数据库时提高性能

时间:2014-03-11 03:42:56

标签: performance entity-framework parsing

我的任务是从文本文件中读取多达800k行,解析每一行,然后将每行添加到数据库中。到目前为止,我的解决方案每秒仅执行15条记录。我正在寻找加快速度的方法。它基本上打开文件,读取下一行,将数据解析为可插入数据库的对象,然后使用Unit of Work和Repository模式与Entity Framework将该对象插入数据库。然后它转到下一行文件。

这是我到目前为止所做的:

    public ActionResult ReadFile()
    {
        int counter = 0;
        string line;
        string filePath = Server.MapPath("~/files/" + "itemmstrnew");
        ProductManager pm = new ProductManager();

        System.IO.StreamReader file = new System.IO.StreamReader(filePath);
        while((line = file.ReadLine()) != null)
        {
            pm.InsertProductByLine(line);              
            counter++;
        }
        file.Close();

        return View();
    }

InsertProductByLine

    public void InsertProductByLine(string line)
    {

        Product product = new Product();
        product.ProductID = "TUR" + line.Substring(0, 6).Trim();
        product.Description = line.Substring(6, 30).Trim();
        product.Status = line.Substring(36, 1);
        product.Hazardous = line.Substring(37, 1);
        product.StandardPrice = Convert.ToDecimal(line.Substring(38, 8));
        product.BestPrice = Convert.ToDecimal(line.Substring(46, 8));
        product.SellUOMID = line.Substring(54, 2);
        product.RetailPrice = Convert.ToDecimal(line.Substring(56, 8));
        product.RetailUOMID = line.Substring(64, 2);
        product.ConvFactor = Convert.ToInt16(line.Substring(66, 6));
        product.Weight = Convert.ToDecimal(line.Substring(72, 6));
        product.Length = Convert.ToDecimal(line.Substring(78, 6));
        product.Width = Convert.ToDecimal(line.Substring(84, 6));
        product.Height = Convert.ToDecimal(line.Substring(90, 6));
        product.Cube = Convert.ToDecimal(line.Substring(96, 6));
        product.SegmentID = line.Substring(102, 4).Trim();
        product.Category = line.Substring(106, 10).Trim();
        product.Subcategory = line.Substring(116, 30).Trim();
        product.Brand = line.Substring(146, 30).Trim();
        product.Model = line.Substring(176, 30).Trim();
        product.PrimaryColor = line.Substring(236, 6).Trim();
        product.SecondaryColor = line.Substring(242, 30).Trim();
        product.ColorPattern = line.Substring(272, 1);
        product.SizeGender = line.Substring(273, 1);
        product.Size = line.Substring(274, 20).Trim();
        product.SizeModifier = line.Substring(294, 1);
        product.VendorPartNo = line.Substring(295, 30).Trim();
        product.Application = line.Substring(325, 55).Trim();
        product.LastUpdated = DateTime.UtcNow;

        this.Insert(product);
        _UnitOfWork.Save();
    }

1 个答案:

答案 0 :(得分:0)

请在内存中读取完整文件一次,然后从内存缓冲区中读取一行。从数据库中读取每一行并不是一个好主意,特别是当有大量记录时。

同时检查您可能随时拥有的文件的最大大小。此操作的频率,以及同时执行此操作的用户数。