我的hdb中有一个分区表,其中包含一个包含大型浮点列表的列(每个元素最多400个浮点数) . 例如,每个元素看起来像
(100.0 1.0 ...)
当尝试从行数特别多的日子中选择此列时,我会收到错误消息
'./2015.02.07/table/column# Cannot allocate memory
同样的错误来自如下查询:
select column[;0] from table where date=2015.02.07
即使在行数较少的日子,此查询也会返回列中每个元素的第一个值 .
有没有办法在select中流式传输此列,以减少将整个列保留在内存中一天的内存需求?
EDIT
.Q.ind在大日子里失败并出现同样的错误 .
即鉴于我可以使用2015.02.01而不是2015.02.02:
.Q.ind[select from table where date=2015.02.01;enlist 1]
很好,但是
.Q.ind[select from table where date=2015.02.02;enlist 1]
失败了
{0!$[#.Q.pm;p3;(?).]@[x;0;p1[;y;z]]}
'./2015.02.10/table/column2#: Cannot allocate memory
@
.[?]
(+`time`sym`column1`column2!`:./2015.02.02/table;();0b;())
我应该注意到我使用的是免费的32位版本
3 回答
我认为这只是自由32位内存限制的组合,事实上你的行数可能很大,而且(不可避免地)在从列中检索数据时必须将某些内容完全拉入内存这一事实,无论是列本身完全被拉入(在非嵌套的情况下)或者它的嵌套索引列被完全拉入 .
另一件需要考虑的事情是kdb使用二次幂(伙伴)内存分配 . 即使今天的表只包含比昨天多一行,每列的内存需求可能会翻倍 . 举一个简单的例子:
在免费的32位版本(Windows)中,您可以创建这么多浮点数,它只使用~1.07g的内存
但是,尝试生成一个额外的浮点数并达到内存限制
因此,如果你接近两个可分配权力的边界,那么即使在一天和下一天之间的差异中的少量行也是非常重要的 .
--DISCLAIMER--以下是hacky,仅用于调试!
您实际上可以手动尝试从嵌套列表中访问数据,但无论如何您仍可能遇到内存问题 .
创建一个嵌套表并展开它
您可以尝试从嵌套索引文件中读取索引
因此,拆分完整的浮点列表(col1#文件)的索引是索引3,索引5,10等
说我想要前3行
然后我知道我需要col1#文件中的前10个浮点数,需要将它们拆分为索引3和5.然后我可以部分读取col1#文件并正确拆分
但这正是KDB无论如何都要做的事情,所以我怀疑你甚至在首先阅读嵌套索引文件时仍然会遇到麻烦 .
检查这个debug / hack,看看你是否可以部分阅读 . 但显然这不是一个长期的解决方案!
嵌套列以通常的方式查询很困难,因为
#
文件也需要加载到内存中(即使使用[;0]
)您最好的选择是选择映射日期分区,然后在块中选择块,例如一次一百万行(或者根据嵌套浮动的大小,任何合理的行) .
如果可以牺牲一些小数精度,也许还可以考虑32位浮点数 .
EDIT
所以评论后我想最好的方法是每次使用
.Q.ind
将每个分区分成多行只是为了给我2美分,我有一个类似的错误,但有64位实例 .
我怀疑内存需要拆分,因为它运行了将近一年 .
弹出实例解决了问题,并释放了大量虚拟内存