我有一个很长的字符串(例如20MB)。
我现在正在解析这个字符串。问题是C#中的字符串是不可变的,这意味着一旦我创建了一个子字符串并查看它,内存就会被浪费。
由于所有的处理过程,内存被String
对象占用了,而且我不再使用、需要或者引用它们;但垃圾回收器需要很长时间才能释放它们。
所以应用程序会因为内存不足而运行失败。
我可以使用效率低下的“合并”方法,并分散几千次调用:
GC.Collect();
虽然字符串无处不在,但这并没有真正解决问题。
我知道使用 StringBuilder
可以在创建大型字符串时使用。
我知道 TextReader
可以将一个 String
读入到一个 char
数组中。
我需要以某种方式“重用”一个字符串,使其不再是不可变的,从而在只需要1k的情况下避免不必要地分配数GB内存。
MHT
文件;每个文件都作为内存中的字符串。MHT
是一个单文件网页;客户将其用作人员的可移植表示。它包含足够大的经过Base64编码的图像以进行面部识别。在数据库位于硬盘或CD上的情况下,我们可以使用StreamReader
(并且在从网站中获取它们时使用StringReader
)-但是然后我们必须将其处理为Char
数组。这样做会使我们失去所有有用的方法String
(StartsWith、SubString、IndexOf)带给我们的好处。而且它已经被写入了。 - Ian Boyd