C# DevForce中数千个重复字符串占用内存

C# DevForce中数千个重复字符串占用内存,c#,memory,devforce,C#,Memory,Devforce,在最近使用dotMemory进行内存分析之后,我们发现内存中有超过十万个重复字符串,总计超过40MB。作为一个数据密集型应用程序,我们希望尽可能地缩减开支 查看配置文件,几乎所有内容都来自EntityRelationLink.UniqueName上的getter。它必须连接字符串,因此默认情况下字符串不会被插入,即使作为一个唯一的名称,我想它不会有太大的变化。有没有办法强迫你在这根绳子上实习 您可能无法从应用程序端修改此行为 在进行大量的1)实体图导入、2)使用EntityCacheState或

在最近使用dotMemory进行内存分析之后,我们发现内存中有超过十万个重复字符串,总计超过40MB。作为一个数据密集型应用程序,我们希望尽可能地缩减开支


查看配置文件,几乎所有内容都来自EntityRelationLink.UniqueName上的getter。它必须连接字符串,因此默认情况下字符串不会被插入,即使作为一个唯一的名称,我想它不会有太大的变化。有没有办法强迫你在这根绳子上实习

您可能无法从应用程序端修改此行为

在进行大量的1)实体图导入、2)使用EntityCacheState或3)查询实体图时,大型模型的问题可能更为明显。尽管您看到大量重复字符串,但好消息是它们应该可用于垃圾收集

我们可以考虑解决这种行为,尽管我不知道在这种情况下,实习是答案。当EntityServer由IIS托管时,我们希望避免插入的字符串超过EntityServer。模型元数据(如EntityRelationLink)在加载后通常是不可变的,因此我们可以在UniqueName getter中进行一些优化,以避免重复的字符串连接


您使用的是哪个版本的DevForce?

对于我们来说,字符串不会消失。它看起来像是
EntityReferenceManager
使用
UniqueName
作为它的
Map
字典中的键。我们有许多实体在应用程序的整个生命周期中都存在(或者应用程序是非常数据驱动的),因此这些地图永远存在,所有的UniqueNames也永远存在。我们可能有1000个实体,所以相同的字符串在内存中存在1000次。我可以理解对字符串实习的厌恶——特别是在像IIS这样的环境中。我认为,如果在构建
EntityRelationLink
时急切地计算UniqueName属性(而不是在每个
get
上创建新实例),我们的许多问题都会得到解决。那么至少只有一个字符串实例最终被用作所有
EntityReferenceManager
字典中的键。是的,我同意。我们应该能够在构造期间格式化UniqueName,然后在getter中使用它;这应该可以解决复制品的问题。另外,我们使用的是7.2.5版。到目前为止,升级到7.3.0已经吓坏了我们,我们一直使用7.2.5(因为迁移到BCL异步包-我知道这是正确的决定,但对我们来说仍然很吓人)。但也许这个修复足以说服我们升级:-)我们已经升级到7.4.0,看起来这个问题已经解决了。谢谢