我需要将数据存储到内存中。我的数据类型数据是字符串。我想最小化内存使用量。我想我必须将字符串更改为字节。我对吗?如果我将字符串转换为字节,这意味着我必须将字符串转换为TMemoryStream?
答案 0 :(得分:5)
如果你真的想转换它,那么这段代码将完成它
var
BinarySize: Integer;
InputString: string;
StringAsBytes: array of Byte;
begin
BinarySize := (Length(InputString) + 1) * SizeOf(Char);
SetLength(StringAsBytes, BinarySize);
Move(InputString[1], StringAsBytes[0], BinarySize);
但如前所述,这不会为你节省记忆。它的使用量几乎相同。你不会从中获益。如果你需要很多字符串采取不同的方法。喜欢这个选择列表中的内容:
如果不了解更多问题,很难提供进一步的帮助。
修改强>:
如果您真的想要最小的内存占用率并且速度稍慢(但仍然非常快),则可以使用Suffix Trie或B-Tree或简单Binary Tree事件。它们可以直接从硬盘驱动器工作,并且可以非常快速地进行搜索。如果然后将数据的子集缓存到RAM,则可以获得最佳的解决方案内存与速度。
无论如何,鉴于您声称拥有大量数据,似乎根本不需要内存优化。 22MB的RAM几乎不是问题,不值得优化。
答案 1 :(得分:1)
您确定这是需要的优化吗?
长度为10个字符的2000行只有20000个字符。
在大多数环境中,这很小。大多数机器都拥有相当多的RAM。大多数磁盘都比这大得多。而且,通常情况下,在网络上发送和接收这么多信息是微不足道的。
也许你的情况很独特。也许你有大量的20000个字符数据集,或者传输这个日期的网页访问速度非常慢等等。但是,我鼓励你考虑一下,即使你是非常好的,也许你不想尝试优化它们。成功实施,不会显着改变您的应用程序在现实世界中的表现。
答案 2 :(得分:0)
使您的存储类型为tutf8string。它可以简单地从tunicodestring分配,转换应该是安全的。