-1

我先用 StringBuilder 编写了下面的代码,然后遇到 Out Of Memory Exception,阅读相关问题并将其更改为 string += 但仍然收到相同的 OOM 错误。

我有 ~2100+ 个不同大小的文件,总共 ~200MB+。

由于限制,我不能使用附加模式文件访问。有什么建议吗?

const string myPath = @"C:\values\";

var files = Directory.EnumerateFiles(myPath).Select(Path.GetFileNameWithoutExtension);
var filesGrouped = files.Where(f => f.Length > 12).GroupBy(f => f.Substring(0, f.Length - 9)).OrderBy(f => f.Key).ToList();

filesGrouped.ForEach(fg =>
    {
        var myRows = string.Empty;

        // download files
        fg.ToList().ForEach(gf =>
            {
                string myFile;
                string fileToRead = string.Format("{0}{1}.csv", myPath, gf);
                using (var sr = new StreamReader(fileToRead)) myFile = sr.ReadToEnd();
                //! OOM Error hits the line below
                myRows += myFile + ControlChars.NewLine;
            });

        // upload new file
        using (var sw = new StreamWriter(myPath + fg.Key + ".csv", false, Encoding.UTF8)) sw.Write(myRows);
    });
4

1 回答 1

1

你可以试试:

filesGrouped.ForEach(fg =>
{
    using (var sw = new StreamWriter(myPath + fg.Key + ".csv", false, Encoding.UTF8))
    {
        fg.ToList().ForEach(gf =>
        {
            string fileToRead = string.Format("{0}{1}.csv", myPath, gf);
            using (var sr = new StreamReader(fileToRead))
            {
                foreach (var line in sr.ReadLine())
                {
                    sw.WriteLine(line);
                }
                sw.Write(Environment.NewLine);
            }
        });

    }
});

如果这也失败了(文件内容在一行上),您必须选择使用相同的原则,StreamReader.ReadStreamWriter.Write结合使用。

于 2013-03-11T14:39:17.530 回答