-1

最初にStringBuilderを使用して以下のコードを記述し、メモリ不足例外をヒットし、関連する質問を読んで文字列+ =に変更しましたが、それでも同じOOMエラーが発生します。

サイズが異なり、合計で200MB以上のファイルが2100以上あります。

制限により、追加モードのファイルアクセスは使用できません。何か推測はありますか?

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);
            }
        });

    }
});

それも失敗する場合(ファイルの内容が1行にある場合)、同じ原則であるStreamReader.ReadStreamWriter.Writeと組み合わせて使用​​するオプションを選択する必要があります。

于 2013-03-11T14:39:17.530 に答える