微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

减少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];

原文地址:https://www.jb51.cc/csharp/93365.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐