我试图从一个大文本文件中读取每一行都有一个单词并将所有值放入一个SQL数据库中,使用一个小文本文件,这工作正常但是当我有一个更大的文本文件时,说300,000行我内存耗尽。
避免这种情况的最佳方法是什么?有没有办法只读取文件的一部分,将其添加到数据库然后将其从内存中取出并继续下一部分?
到目前为止,这是我的代码:
string path = Server.MapPath("~/content/wordlist.txt");
StreamReader word_stream = new StreamReader(path);
string wordlist = word_stream.ReadToEnd();
string[] all_words = wordlist.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
然后我循环遍历数组,将每个值添加到数据库中,但是当文件很大时,它根本不起作用。
答案 0 :(得分:4)
这样做:
// Choose the size of the buffer according
// to your requirements and/or available memory.
int bufferSize = 256 * 1024 * 1024;
string path = Server.MapPath("~/content/wordlist.txt");
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
using (BufferedStream bufferedStream = new BufferedStream(stream, bufferSize))
using (StreamReader reader = new StreamReader(bufferedStream))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
... put line into DB ...
}
}
另外,不要忘记异常处理。
答案 1 :(得分:1)
尝试使用yield return
StreamReader r = new StreamReader(path);
while( !r.EndOfStream )
{
string line = r.ReadLine();
yield return line;
}
也许你读了十行产量返回它们,把它们写入数据库然后下一部分。