如何减少.NET字符串密集型应用程序的内存占用?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

由于性能原因,我的应用程序在内存中有1,000,000个字符串。我的应用程序消耗〜200 MB RAM。

我想减少字符串消耗的内存量。

我知道.NET代表UTF-16编码的字符串(每个字符2个字节)。我的应用程序中的大多数字符串都包含纯英文字符,因此以UTF-8编码存储它们的效率将比UTF-16高2倍。

有没有办法以UTF-8编码的方式在内存中存储字符串,同时允许标准字符串函数?(我的需求主要包括IndexOf与StringComparison.OrdinalIgnoreCase)。

提问于
用户回答回答于

有没有一种方法可以使用UTF-8编码在内存中存储字符串,同时允许使用标准字符串>函数?(我的需求主要包括IndexOf与StringComparison.OrdinalIgnoreCase)。

可以将其存储为字节数组,并提供自己的IndexOf实现(因为IndexOf转换回字符串可能会造成巨大的性能下降)。使用System.Text.Encoding函数(最好的办法是做一个构建步骤来转换为字节,然后从磁盘读取字节数组 - 如果需要,只能转换回字符串显示)。

可以将它们存储在C / C ++库中,让您使用单字节字符串。你可能不希望把他们归还,但你可能只是编组结果(我假设这里有一些搜索)没有太多的perf命中。C ++ / CLI可以使这更容易(通过能够在C ++ / CLI中编写搜索代码,而在C ++中编写字符串“数据库”)。

或者,可以重新访问需要内存中所有字符串的初始性能问题。嵌入式数据库,索引等可以加快速度减少内存使用量,并且更易于维护。

用户回答回答于

不幸的是,你不能改变.Net内部的字符串表示形式。我的猜测是CLR针对多字节字符串进行了优化。

你正在处理的是时空权衡的着名范例,它指出为了获得内存,你必须使用更多的处理器,或者你可以通过使用一些内存来节省处理器。

这就是说,看看这里的一些考虑。如果我是你,一旦确定你的记忆能力已经足够,你可以尝试编写你自己的“字符串”类,它使用ASCII编码。这可能就足够了。

你应该检查这个帖子,“ 内存和字符串 ”。

扫码关注云+社区