【问题标题】:Ravendb memory leak on queryRavendb 查询时内存泄漏
【发布时间】:2017-11-29 06:57:22
【问题描述】:

我在解决 RavenDB 问题时遇到了难题。 在我的工作中,我们有一个过程来尝试识别数据库中指定集合(我们称之为用户集合)中的潜在重复项。

这意味着,我正在遍历集合,并且对于每个文档,都有一个尝试查找相似实体的查询。所以想象一下,这是一项相当长的任务。

我的问题是,当任务开始运行时,RavenDB 的内存消耗越来越高,实际上只是越来越大,而且似乎一直持续到达到系统的最大内存为止。

但这并没有真正的意义,因为我只是在做查询,我使用一个单一的索引并在查询时采用默认页面大小(128)。

有人遇到过类似的问题吗?我真的不知道 ravendb 发生了什么。但这似乎是内存泄漏。

RavenDB 版本:3.0.179

【问题讨论】:

  • 你使用的是什么版本的 RavenDB?
  • 刚刚用 RavenDB 版本更新了帖子
  • 您是否在整个过程中使用单个会话?
  • @Iamisti 的答案对您有帮助吗?
  • @JudahHimango 不,不是

标签: ravendb


【解决方案1】:

当我需要对大型集合进行大量操作时,我会按照以下步骤操作以防止出现内存使用问题:

  1. 我使用Query Streaming 来提取我想要处理的文档的所有ID(使用专门的会话
  2. 我为每个 id 打开一个新会话,我加载文档,然后执行我需要的操作

【讨论】:

  • 第 2 步可能有点矫枉过正。您不需要为每个 ID 建立一个新会话。流媒体很好。如果您需要更新许多对象,请考虑 BulkInsert。
  • @JudahHimango 也许是这样,但我从来没有看到使用这种方法的内存使用有任何问题
【解决方案2】:

首先,建议:如果您不想重复,请使用众所周知的 ID 存储它们。例如,假设您不想要重复的 User 对象。您可以使用使它们独一无二的 ID 来存储它们:

var user = new User() { Email = "foo@bar.com" };
var id = "Users/" + user.Email; // A well-known ID
dbSession.Store(user, id);

然后,当您要检查重复项时,只需检查众所周知的名称:

public string RegisterNewUser(string email)
{
    // Unlike .Query, the .Load call is ACID and never stale.
    var existingUser = dbSession.Load<User>("Users/" + email);
    if (existingUser != null)
    {
        return "Sorry, that email is already taken.";
    }
}

如果您遵循这种模式,您就不必担心运行复杂的查询,也不必担心过时的索引。

如果由于某种原因这种情况对您不起作用,那么我们可以帮助诊断您的内存问题。但要对此进行诊断,我们需要查看您的代码。

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2013-06-16
    • 2017-10-21
    • 2017-11-29
    • 2011-05-21
    • 1970-01-01
    相关资源
    最近更新 更多