0

我正在尝试从每行一个单词的大文本文件中读取并将所有值放入 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);

然后我循环遍历数组,将每个值添加到数据库中,但是当文件很大时,它根本不起作用。

4

2 回答 2

5

像这样做:

// 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 ...
    }
}

另外,不要忘记异常处理。

于 2013-10-20T16:48:46.800 回答
1

试试收益回报

StreamReader r = new StreamReader(path);
while( !r.EndOfStream ) 
{
    string line = r.ReadLine();
    yield return line;
}

也许你读了十行 yield return 它们,将它们写入数据库,然后是下一部分。

于 2013-10-20T19:12:06.253 回答