我需要在RAM中存储很多字符串。但它们不包含特殊的unicode字符,它们都只包含“ISO 8859-1”中的字符,即一个字节。
现在我可以转换每个字符串,将其存储在内存中并将其转换回来使用.Contains()和类似这样的方法,但这会产生开销(在我看来)并且速度很慢。
是否存在快速可靠的字符串类,并提供原始字符串类的一些方法,如.Contains()?
我需要这个在内存中存储更多字符串,使用更少的RAM。或者还有其他方法可以做到吗?
更新
感谢您的评论和答案。
我有一个存储字符串的类。然后通过一个方法调用我需要弄清楚我是否已经在内存中有该字符串。如果列表第二个,我有 1000个字符串。总计数亿。 字符串的平均大小约为20个字符。它真的是关心我的RAM。
我甚至考虑压缩数百万字符串并将这些包存储在内存中。但是每次我需要访问这些值时,我都需要解压缩它。
我也尝试使用HashSet,但所需的内存量甚至更高。
我不需要真正的价值。只是要知道值是否在列表中。因此,如果有一个可以做到的哈希值,那就更好了。但我发现所有内存都需要比纯字符串更多的内存。
目前还没有进一步国际化的计划。所以当我需要时,我会处理这个问题: - )
我不知道使用数据库是否可以解决它。我不需要取任何东西,只是为了知道值是否存储在类中。我需要快速做到这一点。
答案 0 :(得分:6)
你不太可能从中获得任何重要的表现。但是,如果您需要节省内存,这种策略可能是合适的。
要为此目的将string
转换为byte[]
,请使用Encoding.Default.GetBytes()
[1] 。
要将byte[]
转换回string
进行展示或其他基于字符串的处理,请使用Encoding.Default.GetString()
。
如果您使用string
和byte[]
上定义的扩展方法,则可以使代码看起来更好。或者,您可以将byte[]
包装在包装器类型中并将方法放在那里。使此包装器类型为struct
,而不是class
,否则会产生额外的堆分配,这是您要避免的。
但我想警告你 - 你正在丢弃在你的应用程序中使用Unicode的能力。每当你想你需要这样做时,你通常应该把所有的警钟都熄灭。最好是以这样一种方式构建代码,使得当内存大小增加并且内存消耗不再成为问题时,您可以轻松地返回使用string
。
[1] Encoding.Default
返回正在运行的操作系统的当前8位代码页。英语Windows上的默认设置是Windows-1252,这是您想要的。对于俄语Windows,它将是Windows-1251(西里尔语)等。
答案 1 :(得分:3)
根据评论,一个基本上不好的主意。如果你必须这样做,byte []就是你的朋友。 .NET中没有面向字节的字符串类。
答案 2 :(得分:1)
签出string.Intern方法,可以帮助你:
http://www.yoda.arachsys.com/csharp/strings.html
http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_intern_pool
然而,考虑到您的要求,我认为您已经过度工程了。你有20个字符串的1000个字符串= 1000 * 20 * 2 = 40,000个字节,这个内存不多。
如果确实有大量数据,请将其存储在带索引的数据库中。这比一般程序员能想到的任何东西要快得多。