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个英语句子,从每个句子我生成更多这样的子句:
示例:句子:足球是一种非常受欢迎的运动子句我需要:
每个句子逐字存储在树中.因此,考虑到上面的示例,我有一个带有字段="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)