我正在使用正则表达式方法Regex.Replace
来表示大字符串。由于这些字符串被缓存,因此占用大量内存。
我希望在完成微粒操作后清除这些Regex缓存,以便对字符串进行垃圾回收。
我可以使用Regex.CacheSize
属性设置Regex缓存大小,但是如何保持缓存大小并清除缓存?将缓存大小设置为零会影响性能,因为我对同一个字符串多次使用此方法。
如果我将缓存大小设置为零并将其重置为旧值,是否会丢弃缓存的对象并收集垃圾?
代码:
// languageDetails is a xml string holding, xml comments, name space etc.
// Need to remove the comments.
string pattern = "(<!--.*?-->)";
string languageDetails = Regex.Replace(
languageDetails,
pattern,
string.Empty,
RegexOptions.Singleline);
答案 0 :(得分:0)
查看源代码:
public static int CacheSize
{
[__DynamicallyInvokable] get
{
return Regex.cacheSize;
}
[__DynamicallyInvokable] set
{
if (value < 0)
throw new ArgumentOutOfRangeException(nameof (value));
Regex.cacheSize = value;
if (Regex.livecode.Count <= Regex.cacheSize)
return;
lock (Regex.livecode)
{
while (Regex.livecode.Count > Regex.cacheSize)
Regex.livecode.RemoveLast();
}
}
}
如您所见,将值设置为0将调用Regex.livecode.RemoveLast();
因此,它将清除livecode
列表。
答案 1 :(得分:0)
...对于大字符串。由于这些字符串被缓存,因此占用大量内存。
输入/输出字符串不以任何方式缓存。
缓存存储已编译的正则表达式。因此,除非你有很多非常大的模式,否则你的内存问题不是由缓存引起的。