当前位置: 首页 > 知识库问答 >
问题:

在缓存上迭代时,Ignite会消耗所有内存并导致OutOfMemory失败

劳灵均
2023-03-14

我试图使用ScanQuery和iterator迭代所有缓存实体(而不是立即将它们从分布式缓存拉到本地客户机):

IgniteCache cache = ignite.getOrCreateCache("test2");
ScanQuery<Integer, Person> scan = new ScanQuery<>();
scan.setPageSize(256);
Iterator<Cache.Entry<Integer, Person>> it = cache.query(scan).iterator();
int id;
while(it.hasNext()) {
    id = it.next().getValue().getId();
    <...>
}

但是上面的代码失败了,消耗了所有可用的内存。同时,当我试图从缓存中获取迭代器时,它工作得很好:

    IgniteCache cache = ignite.getOrCreateCache("test2");
    Iterator<Cache.Entry<Integer, Person>> it = cache.iterator();
    int id;
    while(it.hasNext()) {
        id = it.next().getValue().getId();
        <...>
    }

文件声明

QueryCursor表示查询结果集,并允许透明的逐页迭代。每当用户开始迭代上一个页面时,它将自动在后台请求下一个页面。

那么为什么用ScanQuery在缓存上迭代时ignite本地节点会失败呢?

共有1个答案

周弘毅
2023-03-14

它看起来像是一个已知的问题https://issues.Apache.org/jira/browse/Ignite-8892它已经被修复,并将在Apache Ignite2.7中提供。您能用最新的分支检查您的代码吗?

 类似资料:
  • 我是spark的新手,有关于迭代器使用spark内存的问题。 在使用数据集的Foreach()或MapPartitions()(甚至直接调用RDD的iterator()函数时,spark是否需要先将整个分区加载到RAM中(假设分区在磁盘中),还是在我们继续迭代时可以延迟加载数据(意味着,spark可以只加载部分分区数据执行任务,并将中间结果保存到磁盘)

  • 我试图以文本格式将简单的MNIST模型图导出到proto缓冲区文件。 实际上,我使用的是模块,但后来我决定切换,因为在keras序列模型中很难为输入和输出张量重命名/指定名称。 这是我的代码: 系统信息和图书馆信息 操作系统:Ubuntu 18.04 LTS 更多信息 正如我前面提到的,当我使用keras时,我可以很容易地按顺序导出keras,并且能够使用从

  • 我正在评估Apache Ignite,以检查它是否符合我们公司的需要。到目前为止还好。现在我正试图了解near cache特性在一致性方面是如何工作的。 我的问题是:除了这个文档之外,还有其他文档解释它是如何工作的吗?特别是,我想知道对任何其他实例的任何后续读请求(在写请求之后)是否会获得更新的数据(没有最终的一致性)。 谢了!

  • 当启用和禁用本机持久性时,我加载了相同数量的数据。我注意到当启用本机持久性时,堆外内存使用量增加了x4倍。正常吗?

  • 问题内容: 我目前正在将Zend Framework与PHPUnit结合使用,以对应用程序进行单元测试。当Hudson执行PHPUnit shell命令时,在代码覆盖率生成期间的某个时候达到了最大PHP内存限制。我目前总共进行了41个测试,包含334个断言。 通过使用开关将memory_limit设置提高到768M,我已经成功消除了此错误;但是,我担心随着复杂性以及测试/断言总数的增加,我将没有足

  • 是否可以限制会话和与之相关的请求可以使用的内存量? 例如,我希望将每个用户会话限制为一兆字节。此限制应适用于处理请求时创建的任何对象。有可能吗?