C# · 12月 27, 2021

减少C#应用程序的内存占用

我正在开发一个需要处理大约4,000,000个英文句子的C#应用​​程序.所有这些句子都存储在树中.树中每个节点都是具有以下字段的类: class TreeNode{ protected string word; protected Dictionary<string,TreeNode> children;}

我的问题是,当它达到第200万个句子时,应用程序正在使用所有的RAM(我有2 GB RAM).所以它只能处理一半的句子,然后它显着减慢.

我可以做些什么来尝试减少应用程序的内存占用?

编辑:让我来解释一下我的申请.所以我有大约30万个英文句子,从每个句子我正在生成更多的子句,如下所示:

例:
句子:足球是非常受欢迎的运动
子句我需要:

>足球是非常受欢迎的运动
>是一个非常受欢迎的运动
>一个非常受欢迎的运动
>非常受欢迎的运动
>流行运动
>运动

每个句子都逐字地存储在树中.所以考虑到上面的例子,我有一个TreeNode类,其中的字段为“足球”,子列表中的\”Node“为TreeNode. “is”节点的子节点是“a”节点. “a”节点的子节点是“非常”节点.我需要逐字存储句子,因为我需要能够搜索从例子开始的所有句子:“Football is”.

所以基本上对于一个句子中的每个单词,我正在创建一个新的(子句子).这就是我最终最终得到400万个不同句子的原因.将数据存储在数据库中是不可选的,因为应用程序需要一次在整个结构上工作.如果我不得不把所有的数据写入数据库,它将进一步减缓这个过程.

谢谢

解决方法 你用什么作为关键?你从哪里获取数据?如果这些是单词(不是完整的),我想知道你是否有很多重复的键(具有相同的基本值的不同的字符串实例),在这种情况下,您可能会从实现本地的内部函数重新使用值(并让瞬态拷贝收集垃圾). public sealed class StringCache { private readonly Dictionary<string,string> values = new Dictionary<string,string>(StringComparer.Ordinal); public string this[string value] { get { string cached; if (!values.TryGetValue(value,out cached)) { values.Add(value,value); cached = value; } return cached; } }}

在构建树时实例化,并使用(当您认为值可能被重复时):

StringCache cache = new StringCache(); // re-use this instance while building // your tree…string s = … // whatever (from reading your input)s = cache[s];