【问题标题】:KDB/Q memory consumptionKDB/Q 内存消耗
【发布时间】:2012-04-16 09:43:50
【问题描述】:

我有一个 KDB/Q 数据库,每天有大约 200 万条记录,消耗大约 2G 内存。在一天结束时,它会运行一些报告内容,在表之间进行连接并将结果输出到磁盘上的文件中。在计算期间,内存使用量增长到~15G。我的问题是,一旦此操作完成,内存就永远不会被释放,直到数据库重新启动它才会消耗所有 15G 内存。

我想告诉 KDB 从内存中卸载一些表(但不要删除它们),但我不想重新启动数据库,因为其他一些应用程序仍在连接到它。

有没有办法告诉 KDB 从内存中卸载某些东西?

编辑:

如果有人觉得这很有趣,我建议查看.Q.gc[] 的 KDB 2.5+,看起来很有希望。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    以下是我的研究总结:

    • KDB 之前的版本。 2.5 根据需要分配 64MB 内存块并且从不释放它们。但它可以重复使用它们。
    • 最近的 KDB 版本允许 .Q.gc[] 调用,这是对垃圾收集器的请求调用(KDB 使用 ref.counting btw。)
    • 当您调用一些分配大量内存(在我的情况下约为 20gB)的内存密集型计算并且您希望在计算完成后释放内存时,这尤其有用。
    • 您始终可以考虑将内存密集型脚本放入单独的 Q 进程中,以便在脚本完成后释放内存

    【讨论】:

      【解决方案2】:

      这可能很明显,但除了检查您的 q 版本的垃圾收集模式之外,请确保您实际上已经摆脱了正在使用内存的内存中数据。如果您可以摆脱整个表(例如,这是一个参与计算的临时表),只需将其从根命名空间中删除

      delete table from`.
      

      如果没有,你可以删除它的所有行

      delete from`table
      

      【讨论】:

        【解决方案3】:

        对于将来尝试此操作的任何人来说,最简单的方法是:

        1. 启动新的 KDB 进程。
        2. 从该进程查询中选择所需的最小有限数据子集。
        3. 从该进程执行任何连接/计算/写入文件。 (允许原件继续处理请求)
        4. 关闭进程,释放所有内存。

        如上述海报所述,较新版本的 KDB 可以更好地释放内存,但并不完美。

        我们公司网站上有一篇很好的文章,详细介绍了 KDB+ 内存管理: http://timestored.com/kdbGuides/memoryManagement

        【讨论】:

          【解决方案4】:

          http://code.kx.com/q4m3/12_Workspace_Organization/#125-expunging-from-a-context

          我使用了几个不同的命令。只要您的表在删除之前存储在磁盘上,就可以了。

          这是创建表之前的会话。

          q).Q.w[]
          used| 290192
          heap| 67108864
          peak| 67108864
          wmax| 0
          mmap| 0
          mphy| 8589934592
          syms| 629
          symw| 20704
          

          此命令创建表,然后将其保存到磁盘。

          q)t:([]10000?"ab"; 10000?5)
          q)save `t
          `:t
          

          表还在内存中

          q).Q.w[]
          used| 437808
          heap| 67108864
          peak| 67108864
          wmax| 0
          mmap| 0
          mphy| 8589934592
          syms| 629
          symw| 20704
          

          让我们从内存中删除变量并进行垃圾收集。

          q)delete t from `.
          `.
          q).Q.gc[]
          0
          

          现在“使用的内存”已减少到与会话开始类似的数量。

          q).Q.w[]
          used| 290208
          heap| 67108864
          peak| 67108864
          wmax| 0
          mmap| 0
          mphy| 8589934592
          syms| 630
          symw| 20730
          q)\v
          `symbol$()
          

          【讨论】:

            猜你喜欢
            • 2010-10-12
            • 1970-01-01
            • 2011-10-03
            • 2012-11-24
            • 2013-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多