创建长十六进制字符串会导致内存不足异常

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.

}

字符串是处理大量数据的糟糕方式,因为它们是不可变的,您拥有的代码会在处理每个数据时创建大量副本。

尝试将所有内容都用作字节,直到不能为止,并以块的形式处理而不是一次全部处理。

例如,从文件中读取字节,直到您看到魔术字节(您从魔术字符串创建的)过程,保存它,然后继续。数组必须是连续的,因此限制它们的大小以避免 运行 大块内存不足,即使总体上有足够的可用空间。