从 c# 中的大型文本文件读取导致内存泄漏

本文关键字:读取 内存 泄漏 文件 文本 大型 | 更新日期: 2023-09-27 18:36:04

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

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

从 c# 中的大型文本文件读取导致内存泄漏

这样做:

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

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

尝试收益率

回报

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

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