【发布时间】:2016-06-26 10:37:42
【问题描述】:
我逐行读取文件并使用实体框架将此数据插入数据库。阅读速度非常慢。该文件几乎有 600 万行,我需要提高文件的读取性能。这是该文件中的单词字典,我需要将这些单词插入数据库表中。下面是该文件的几行。
390201
ТАТАМИ NOUN,inan,neut,Fixd sing,nomn
ТАТАМИ NOUN,inan,neut,Fixd sing,gent
ТАТАМИ NOUN,inan,neut,Fixd sing,datv
ТАТАМИ NOUN,inan,neut,Fixd sing,accs
ТАТАМИ NOUN,inan,neut,Fixd sing,ablt
ТАsing,gent
ОРИГАМИ NOUN,inan,neut,Fixd ТАМИ NOUN,inan,neut,Fixd sing,loct
ТАТАМИ NOUN,inan,neut,Fixd plur,nomn
ТАТАМИ NOUN,inan,neut,Fixd plur,gent
ТАТАМИ NOUN,inan,neut,Fixd plur,datv
ТАТАМИ NOUN,inan,neut,Fixd plur,accs
ТАТАМИ NOUN,inan,neut,Fixd plur,ablt
ТАТАМИ NOUN,inan,neut,Fixd plur,loct
390202
ОРИГАМИ NOUN,inan,neut,Fixd sing,nomn
ОРИГАМИ NOUN,inan,neut,Fixd sing,datv
ОРИГАМИ NOUN,inan,neut,Fixd sing,accs
ОРИГАМИ NOUN,inan,neut,Fixd sing,ablt
ОРИГАМИ NOUN,inan,neut,Fixd sing,loct
ОРИГАМИ NOUN,inan,neut,Fixd plur,nomn
ОРИГАМИ NOUN,inan,neut,Fixd plur,gent
ОРИГАМИ NOUN,inan,neut,Fixd plur,datv
ОРИГАМИ NOUN,inan,neut,Fixd plur,accs
我解析该文件的代码如下:
public static void parseFileFromToSegment(int beginId, int endId)
{
using (var db = new Context())
{
string theWordFromFile;
string wordData;
int wordIdFromFile = 1;
int tempWordId;
IEnumerable<string> allFileLines = File.ReadLines(fileName);
allFileLines = allFileLines.SkipWhile(n => n != beginId.ToString());
foreach (string line in allFileLines)
{
if (string.IsNullOrEmpty(line))
continue;
if (!string.IsNullOrEmpty(line) && Int32.TryParse(line, out tempWordId))
{
if (tempWordId < beginId)
{
continue;
}
if (tempWordId > endId)
break;
wordIdFromFile = tempWordId;
if (wordIdFromFile % 100 == 0)
Console.WriteLine("Current id - " + wordIdFromFile);
continue;
}
theWordFromFile = line.Substring(0, line.IndexOf('\t'));
wordData = line.Substring(line.IndexOf('\t')).Trim();
TheWord theWord = new TheWord { WordFormId = wordIdFromFile, word = theWordFromFile, word_form_data = wordData };
db.TheWords.Add(theWord);
}
db.SaveChanges();
Console.WriteLine("saved");
}
}
所以阅读速度很慢。我可以做些什么来提高性能?谢谢
【问题讨论】:
-
您确定性能下降不是因为在单个
SaveChanges()中向 EF 添加了 600 万条记录吗? -
@SimonKarlsson 他已经在这样做了。
File.ReadLines返回一个IEnumerable<string>并在下面使用StreamReader.ReadLine() -
这块
!string.IsNullOrEmpty(line) &&没用。您之前已经检查了相反的行。但它不会改变速度 -
尝试在循环内调用
SaveChanges()- 当然不是每次迭代都如此。您可以保存每 1000 行 -
@Alexander Derck 你说得对,谢谢。我为“theWord”对象创建了一个 List 并使用 List.AddRange(list with theWord objects) 方法 - 问题已解决 - 它是在检测 EF 的变化。