用C#将大数据写入MemoryStream

Write large data into MemoryStream with C#

我有一个大流 (4Go),我需要替换那个流中的一些字符(我需要用 2 个或 3 个字符替换一个特定字符),我从 à service à.d 获取流to return 返回一个流。 这就是我正在做的

private static Stream UpdateStream(Stream stream, string oldCharacters, string newCharacters, int size = 2048)
{
    stream.Position = 0;

    StreamReader reader = new StreamReader(stream);

    MemoryStream outputStream = new MemoryStream();
    StreamWriter writer = new StreamWriter(outputStream);
    writer.AutoFlush = true;

    char[] buffer = new char[size];

    while (!reader.EndOfStream)
    {
        reader.Read(buffer, 0, buffer.Length);
        if (buffer != null)
        {
            string line = new string(buffer);
            if (!string.IsNullOrEmpty(line))
            {
                  string newLine = line.Replace(oldCharacters, newCharacters);
                writer.Write(newLine);
            }
        }
    }

    return outputStream;
}

但是我在这一行的某个时候遇到了 OutOfMemory 异常,但是在查看计算机内存时我仍然有可用的工厂。

writer.Write(newLine);

有什么建议吗?

这不是答案,但我无法将其放入评论中。

目前你的问题不做一些假设是无法解决的。据我所知,问题是您想替换保存在文件中的大量文本的某些部分,然后再次将修改后的文本保存在文件中。

一些未知变量:

  • 您要替换的字符串有多长?
  • 您要替换的字符串有多长?与替换字符串的长度相同?
  • 您要替换哪种字符串?一个字?一个完整的句子?一整段?

您的问题的解决方案是将文件分块读入内存,替换必要的文本并将“更新”文本保存在新文件中,然后最后将“新文件”重命名为旧文件。但是,在不知道以上几点的答案的情况下,您可能想要替换与文件中所有文本一样长的字符串(不太可能,是的)。这意味着为了进行“替换”,我 必须 将整个文件读入内存,然后才能替换任何文本,这会导致 OutOfMemoryException。 (是的,您可以进行一些巧妙的扫描来替换如此大的字符串,而无需一次将其全部读入内存,但我怀疑这里是否需要这样的解决方案)。

edit你的问题来解决以上几点。

所以为了让它工作我必须:

  • 使用此 post
  • 中的 HugeMemoryStream class
  • 并将 gcAllowVeryLargeObjects 参数定义为 true

  • 并将构建设置为 64 位(首选 32 位未选中)