2015-02-07 13 views
0

我在我的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中流式传输这一列,以减少在整天大量的内存中保存整列的内存需求?

编辑

.Q.ind大天失败,出现同样的错误。

即给出我可以用2015年2月1日的工作,但不是2015年2月2日:

.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位版本

回答

1

我认为这是自由32位的一切只是一个组合内存的限制,你的行数可能很大,事实上(不可避免)东西必须从列中检索数据时完全拉入内存,无论是列本身是否完全拉入(在非-nested case)或者它的嵌套索引列被完全拉入。

另一件需要考虑的事情是kdb使用power-of-two(伙伴)内存分配。即使今天的表只包含比昨天多一行,每列的内存需求可能会增加一倍。举个简单的例子:

在免费的32位版本(Windows)可以创造这么多花车和它仅使用〜内存1.07gb

q)\ts 134217726?1.0 
3093 1073741952 

然而,尝试生成一个额外的浮动和你打如果你的两个分配权力的边界附近内存限制

q)\ts 134217727?1.0 
wsfull 

在一天和下之间的差异行因此即使是很小的量可能非常显著。

- DISCLAIMER--下面是hacky,仅用于调试!

实际上,您可以手动尝试访问嵌套列表中的数据,尽管您仍然可能在此处遇到内存问题。

创建一个嵌套表,并张开它

q)tab:([] col1:(101 102 103f;104 105f;106 107 108 109 110f;111 112f)) 
q)tab 
col1 
-------------------- 
101 102 103f 
104 105f 
106 107 108 109 110f 
111 112f 
q) 
q)`:test/ set tab 
`:test/ 

你可以尝试从嵌套索引文件的索引读取

q)2_first (enlist "j";enlist 8)1:`:test/col1 
3 5 10 12 

所以指数分裂花车的完整列表(的COL1#文件)是指数3,索引5,10等等等等

说我希望第3行

q)myrows:3#2_first (enlist "j";enlist 8)1:`:test/col1 
q)myrows 
3 5 10 

然后我知道我需要从COL1#文件的第一个10个飘浮并需要将它们在指数3和5分开。然后我可以读取COL1#文件部分和拆分它正确

q)(0,-1_myrows) cut raze (enlist "f";enlist 8)1:(`$":test/col1#";0;8*last myrows) 
101 102 103f 
104 105f 
106 107 108 109 110f 

但是这正是KDB在封面下所做的,所以我怀疑即使在嵌套索引文件中读取数据时仍然会遇到问题。

检查此调试/黑客,看看你是否可以部分读取这种方式。但显然这不是一个长期的解决方案!

+0

感谢您的帮助,请您详细介绍两种功能在免责声明中使用?我能够从以前无法访问的日期手动读取几行,但我不确定发生了什么。为什么要参加8?为什么你先阅读没有“#”的专栏?在第二个函数中,你给出的3个变量是什么? – nightTrevors 2015-02-13 00:29:51

+1

首先,你可能已经意识到,当你有一个嵌套的浮动列时,kdb将整个*拼接的浮动列表作为“#”文件存储在磁盘上,然后存储要在其中分割列表的索引非#文件。因此,为了检索数据,kdb首先进入非#文件以了解如何分割列表,然后根据这些索引从#文件中抓取块,然后返回相关的嵌套列表。我正在手动复制上述内容。对于你的问题http://code.kx.com/wiki/Reference/OneColon .....“8”,因为我读长/浮动,3变量是(文件;偏移;长度) – terrylynch 2015-02-13 14:12:40

+1

编辑 - 看到更正/澄清在我原来的职位 – terrylynch 2015-02-13 16:45:12

1

个嵌套列使查询以通常的方式很难,因为#文件也需要被加载到内存中(即使有[;0]

最好的办法是选择映射日期分区,然后在块中选择按大块,例如一次有100万行(或者考虑到嵌套浮动的大小,任何明智的行)。

也许还会考虑32位浮点数,如果可以牺牲一些小数精度的话。

编辑

所以意见后,我想最好的办法就是去每个分区多条线路在同一时间与.Q.ind

+0

您可以请扩展您的修复?我不能访问具有索引格式的行,直到当天的整列存储在内存中 – nightTrevors 2015-02-09 22:33:56

+0

'select from table where date = xxx'不会将整个表拉入内存,它会被映射。然后你可以用'i'结果来使用结果,或者更好的办法是使用.Q.ind – 2015-02-10 18:56:03

+0

当用这种方式选择时,我遇到了同样的错误。明确我的错误:{0!$ [#。Q.pm; p3;(?)。] @ [x; 0; p1 [; y; z]]} './2015.02.10/table/column2#:无法分配内存 @ 。[?] (+'time'sym'column1'column2!':./ 2015.02.10/table;(); 0b()) – nightTrevors 2015-02-11 01:13:10