首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何减少.NET字符串密集型应用程序的内存占用?

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

Stack Overflow用户
提问于 2012-03-10 02:45:29
回答 5查看 6.4K关注 0票数 19

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

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

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

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

EN

回答 5

Stack Overflow用户

发布于 2012-03-10 03:49:19

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

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

这就是说,看看here的一些注意事项。如果我是您,一旦确定内存增益对您来说就足够了,请尝试编写您自己的"string“类,该类使用ASCII编码。这可能就足够了。

更新:

关于更多的钱,你应该看看这篇文章,"Of memory and strings",由StackOverflow传奇人物Jon Skeet写的,它解决了你面临的问题。很抱歉我没有马上提到它,我花了一些时间才找到Jon的确切帖子。

票数 13
EN

Stack Overflow用户

发布于 2012-03-10 03:35:40

有没有办法在内存中存储UTF8编码的字符串,同时允许使用标准的字符串>函数?(我的需求主要包括使用StringComparison.OrdinalIgnoreCase的IndexOf )。

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

您可以将它们存储在C/C++库中,这样就可以使用单字节字符串。您可能不想将它们编组回去,但您可能只编组结果(我假设这里正在进行某种搜索),而没有太多的性能命中。C++/CLI可能会让这件事变得更容易(通过能够用C++/CLI编写搜索代码,但用C++编写字符串“数据库”)。

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

票数 4
EN

Stack Overflow用户

发布于 2012-03-10 03:25:19

如果你把它存储为一个字节数组呢?当你需要对其进行某些操作时,只需恢复为string即可。我创建了一个用于设置和获取字符串的类,它在内部将其存储为bytearray。

到bytearray:

代码语言:javascript
复制
string s = "whatever";
byte[] b = System.Text.Encoding.UTF8.GetBytes(s);

要字符串,请执行以下操作:

代码语言:javascript
复制
string s = System.Text.Encoding.UTF8.GetString(b);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9639342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档