我的任务是从文本文件中读取多达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();
}
答案 0 :(得分:0)
请在内存中读取完整文件一次,然后从内存缓冲区中读取一行。从数据库中读取每一行并不是一个好主意,特别是当有大量记录时。
同时检查您可能随时拥有的文件的最大大小。此操作的频率,以及同时执行此操作的用户数。