创建长十六进制字符串会导致内存不足异常
Creating a long hex string results in an Out of Memory exception
我正在尝试处理大型串联文件并将它们拆分回单独的文件。对于任何想知道的人,searchString
包含构成文件头的幻数,用于告诉每个文件从哪里开始。
这一行
string dataString = String.Concat(dataByte.Select(b => b.ToString("x2")));
...结果为:
Out of Memory exception
我见过几种可以处理大文件的不同方法,但是 none 这些方法似乎以我需要此程序的方式处理数据。有什么方法可以在不更改 foreach 循环内的任何内容的情况下更正 Out of Memory exception
吗?
byte[] dataByte = File.ReadAllBytes(pathString);
string dataString = String.Concat(dataByte.Select(b => b.ToString("x2")));
string[] LineArray = Regex.Split(dataString, searchString);
foreach (string LineResult in LineArray)
{
//The string processing operations go here.
//The individual files are created from the output.
}
字符串是处理大量数据的糟糕方式,因为它们是不可变的,您拥有的代码会在处理每个数据时创建大量副本。
尝试将所有内容都用作字节,直到不能为止,并以块的形式处理而不是一次全部处理。
例如,从文件中读取字节,直到您看到魔术字节(您从魔术字符串创建的)过程,保存它,然后继续。数组必须是连续的,因此限制它们的大小以避免 运行 大块内存不足,即使总体上有足够的可用空间。
我正在尝试处理大型串联文件并将它们拆分回单独的文件。对于任何想知道的人,searchString
包含构成文件头的幻数,用于告诉每个文件从哪里开始。
这一行
string dataString = String.Concat(dataByte.Select(b => b.ToString("x2")));
...结果为:
Out of Memory exception
我见过几种可以处理大文件的不同方法,但是 none 这些方法似乎以我需要此程序的方式处理数据。有什么方法可以在不更改 foreach 循环内的任何内容的情况下更正 Out of Memory exception
吗?
byte[] dataByte = File.ReadAllBytes(pathString);
string dataString = String.Concat(dataByte.Select(b => b.ToString("x2")));
string[] LineArray = Regex.Split(dataString, searchString);
foreach (string LineResult in LineArray)
{
//The string processing operations go here.
//The individual files are created from the output.
}
字符串是处理大量数据的糟糕方式,因为它们是不可变的,您拥有的代码会在处理每个数据时创建大量副本。
尝试将所有内容都用作字节,直到不能为止,并以块的形式处理而不是一次全部处理。
例如,从文件中读取字节,直到您看到魔术字节(您从魔术字符串创建的)过程,保存它,然后继续。数组必须是连续的,因此限制它们的大小以避免 运行 大块内存不足,即使总体上有足够的可用空间。