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

PB_*_*MLT 9 c# memory-management

我正在开发一个C#应用程序,需要处理大约4,000,000个英语句子.所有这些句子都存储在树中.树中的每个节点都是具有以下字段的类:

class TreeNode
{
    protected string word;
    protected Dictionary<string, TreeNode> children;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是当应用程序达到第2,000,000个句子时,它正在耗尽所有RAM(我有2 GB RAM).所以它只能设法处理一半的句子,然后它会大幅减速.

我该怎么做才能尝试减少应用程序的内存占用?

编辑:让我解释一下我的申请.所以我有大约300,000个英语句子,从每个句子我生成更多这样的子句:

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

  1. 足球是一项非常受欢迎的运动
  2. 是一项非常受欢迎的运动
  3. 一项非常受欢迎的运动
  4. 很受欢迎的运动
  5. 流行的运动
  6. 运动

每个句子逐字存储在树中.因此,考虑到上面的示例,我有一个带有字段="Football"的TreeNode类,子列表具有单词"is"的TreeNode."是"节点的子节点是"a"节点."a"节点的子节点是"非常"节点.我需要逐字存储句子,因为我需要能够搜索所有以例句开头的句子:"足球是".

因此,基本上对于句子中的每个单词,我创建一个新的(子句).这就是我最终得到4,000,000个不同句子的原因.将数据存储在数据库中不是一种选择,因为应用程序需要立即处理整个结构.如果我不得不将所有数据写入数据库,它将进一步减慢进程.

谢谢

Mar*_*ell 10

你用什么作为钥匙?你从哪里获得数据?如果这些是单词(不是完整的句子),我想知道你是否有很多重复的密钥(string具有相同基本值的不同实例),在这种情况下,您可能会受益于实现本地interner来重用这些值(让瞬态副本得到垃圾收集).

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

StringCache cache = new StringCache(); // re-use this instance while building
                                       // your tree
...
string s = ... // whatever (from reading your input)
s = cache[s];
Run Code Online (Sandbox Code Playgroud)

  • 毫无疑问,这将减少内存需求.远远少于400万字 - 它接近100k.实习他们将产生巨大的变化. (2认同)