KDB/Q内存消耗

Jan*_*yka 9 kdb

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

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

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

编辑:

如果有人发现它有趣我建议看看.Q.gc[]KDB 2.5+,看起来很有希望.

Jan*_*yka 9

以下是我的研究总结:

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


Aar*_*ies 5

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

delete table from`.
Run Code Online (Sandbox Code Playgroud)

如果没有,您可以删除其所有行

delete from`table
Run Code Online (Sandbox Code Playgroud)