出于性能原因,我有一个应用程序在内存中有大约1,000,000个字符串。我的应用程序消耗了大约200MB的RAM。
我想减少字符串消耗的内存量。
我知道.NET表示UTF16编码的字符串(每个字符2个字节)。我的应用程序中的大多数字符串都包含纯英语字符,因此以UTF-8编码存储它们的效率将是UTF-16编码的两倍。
有没有办法在允许标准字符串函数的同时以UTF-8编码将字符串存储在内存中?(我的需求主要包括使用StringComparison.OrdinalIgnoreCase的IndexOf )。
发布于 2012-03-10 03:49:19
不幸的是,你不能改变字符串的.Net内部表示。我的猜测是CLR针对多字节字符串进行了优化。
您正在处理的是著名的范例,它指出,为了获得内存,您必须使用更多的处理器,或者您可以通过使用一些内存来节省处理器。
这就是说,看看here的一些注意事项。如果我是您,一旦确定内存增益对您来说就足够了,请尝试编写您自己的"string“类,该类使用ASCII编码。这可能就足够了。
更新:
关于更多的钱,你应该看看这篇文章,"Of memory and strings",由StackOverflow传奇人物Jon Skeet写的,它解决了你面临的问题。很抱歉我没有马上提到它,我花了一些时间才找到Jon的确切帖子。
发布于 2012-03-10 03:35:40
有没有办法在内存中存储UTF8编码的字符串,同时允许使用标准的字符串>函数?(我的需求主要包括使用StringComparison.OrdinalIgnoreCase的IndexOf )。
您可以存储为字节数组,并提供您自己的IndexOf实现(因为为IndexOf转换回string可能会对性能造成巨大的影响)。为此使用System.Text.Encoding函数(最好的方法是执行一个构建步骤,将其转换为字节,然后从磁盘读取字节数组-如果需要,仅转换回字符串以供显示)。
您可以将它们存储在C/C++库中,这样就可以使用单字节字符串。您可能不想将它们编组回去,但您可能只编组结果(我假设这里正在进行某种搜索),而没有太多的性能命中。C++/CLI可能会让这件事变得更容易(通过能够用C++/CLI编写搜索代码,但用C++编写字符串“数据库”)。
或者,您可以重新处理需要内存中所有字符串的初始性能问题。嵌入式数据库、索引等既可以加快速度,又可以减少内存使用--而且更易于维护。
发布于 2012-03-10 03:25:19
如果你把它存储为一个字节数组呢?当你需要对其进行某些操作时,只需恢复为string即可。我创建了一个用于设置和获取字符串的类,它在内部将其存储为bytearray。
到bytearray:
string s = "whatever";
byte[] b = System.Text.Encoding.UTF8.GetBytes(s);
要字符串,请执行以下操作:
string s = System.Text.Encoding.UTF8.GetString(b);
https://stackoverflow.com/questions/9639342
复制相似问题