用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 位未选中)
我有一个大流 (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
- 并将 gcAllowVeryLargeObjects 参数定义为 true
- 并将构建设置为 64 位(首选 32 位未选中)