【发布时间】:2011-11-11 14:24:50
【问题描述】:
我有一个大字符串(例如 20MB)。
我现在正在解析这个字符串。问题是 C# 中的字符串是不可变的。这意味着一旦我创建了一个子字符串并查看它,内存就被浪费了。
由于所有的处理,内存被我不再使用、需要或引用的 String 对象堵塞;但是垃圾收集器需要很长时间才能释放它们。
所以应用程序内存不足。
我可以使用性能不佳的 club 方法,然后调用几千次:
GC.Collect();
无处不在,但这并不能真正解决问题。
我知道StringBuilder 在创建 一个大字符串时存在。
我知道TextReader 的存在是为了将String 读入char 数组。
我需要以某种方式“重用”一个字符串,使其不再是不可变的,这样我就不会在 1k 的情况下不必要地分配千兆字节的内存。
【问题讨论】:
-
你不能,除非你把它钉住并且变得不安全(你可以直接用不安全的代码修改缓冲区)。我认为您可能需要使用流并且一次只读取一点点
-
根据您对数据的处理方式,实现您自己的“字符串”类可能是有意义的,其中子字符串实际上是对父字符串的引用(类似于 Java 对 @987654329 所做的@)。这样,只有原始字符串数据存储在内存中。你可能也想看看这篇文章:stackoverflow.com/questions/6742923/…
-
我猜你还有一些你不知道的参考资料。
-
如果你正在制作一千万个字符串,那么很有可能你做错了什么。为什么你首先在内存中有这么大的字符串?您是否需要将整个内容保存在内存中才能解析它?解析器通常以仅向前的方式使用字符串,并具有有限的前瞻性;为什么你需要一次在内存中的整个字符串?
标签: c# string garbage-collection immutability