KDB/Q内存消耗
问题描述:
答
下面是总结我的研究:
- KDB为版本之前。 2.5根据需要分配64MB内存块,从不释放它们。它能够重用它们。
- 最近KDB版本允许
.Q.gc[]
通话这是对请求调用垃圾收集器(KDB使用参考。顺便说一句计数。) - 当你调用一些内存密集型计算其分配大量内存(在我的情况下,这是非常有用的它是〜20gB)并且您想在计算完成后释放内存。
- 你总是可以考虑将内存密集型脚本到一个单独的Q的处理,因此内存将被释放,一旦脚本完成
答
这可能是显而易见的,但除了检查您的版本垃圾收集模式的q,确保你确实已经摆脱了使用内存的内存数据。如果你确定与摆脱整个表格的(例如,这是参与计算的临时表),刚刚从根命名空间中删除
delete table from`.
如果没有,你可以删除其所有行
delete from`table
答
对于任何人在未来的最简单的方法尝试,这将一直到:
- 启动一个新的KDB过程。
- 从这一过程查询来选择出所需要的数据的最小有限子集。
- 执行连接/计算/写从过程到文件。 (允许原进行处理的请求)
- 关闭的过程中,释放所有的内存。
正如上述海报所提到的,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$()