gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:35:31 24 4
gpt4 key购买 nike

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

class TreeNode
{
protected string word;
protected Dictionary<string, TreeNode> children;
}

我的问题是应用程序在执行到第 2,000,000 句时耗尽了所有 RAM(我有 2 GB RAM)。所以它只能设法处理一半的句子,然后速度会急剧下降。

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

编辑:让我再解释一下我的应用程序。所以我有大约 300,000 个英语句子,并且从每个句子中我生成更多的子句,如下所示:

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

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

每个句子都逐字存储在树中。所以考虑到上面的例子,我有一个 TreeNode 类,其中包含单词字段 =“Football”,并且子列表包含单词“is”的 TreeNode。 “is”节点的子节点是“a”节点。 “a”节点的子节点是“very”节点。我需要逐字存储句子,因为我需要能够搜索所有以示例开头的句子:“Football is”。

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

谢谢

最佳答案

您使用的 key 是什么?您从哪里获取数据?如果这些是单词(不是完整的集合),我想知道您是否有很多重复的键(不同的string实例具有相同的基本值(value)),在这种情况下,您可能会受益于实现本地内部人员以重新使用这些值(并让临时副本得到垃圾收集)。

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

关于c# - 减少 C# 应用程序的内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1990210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com