KDB/Q内存消耗

问题描述:

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

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

有没有办法告诉KDB卸载内存中的东西?

编辑:

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

下面是总结我的研究:

  • KDB为版本之前。 2.5根据需要分配64MB内存块,从不释放它们。它能够重用它们。
  • 最近KDB版本允许.Q.gc[]通话这是对请求调用垃圾收集器(KDB使用参考。顺便说一句计数。)
  • 当你调用一些内存密集型计算其分配大量内存(在我的情况下,这是非常有用的它是〜20gB)并且您想在计算完成后释放内存。
  • 你总是可以考虑将内存密集型脚本到一个单独的Q的处理,因此内存将被释放,一旦脚本完成

这可能是显而易见的,但除了检查您的版本垃圾收集模式的q,确保你确实已经摆脱了使用内存的内存数据。如果你确定与摆脱整个表格的(例如,这是参与计算的临时表),刚刚从根命名空间中删除

delete table from`. 

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

delete from`table 

对于任何人在未来的最简单的方法尝试,这将一直到:

  1. 启动一个新的KDB过程。
  2. 从这一过程查询来选择出所需要的数据的最小有限子集。
  3. 执行连接/计算/写从过程到文件。 (允许原进行处理的请求)
  4. 关闭的过程中,释放所有的内存。

正如上述海报所提到的,KDB的新版本释放内存更好但不完美。

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

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$()