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

即使在行数较少的日子里,此查询也会返回列中每个元素的第一个值。

有没有办法在选择中流式传输此列,以减少将整列保存在内存中一整天的内存需求?

编辑

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

4

3 回答 3

1

嵌套列使以通常的方式查询变得困难,因为#文件还需要加载到内存中(即使使用 a [;0]

您最好的选择是选择映射一个日期分区,然后在该块中逐块选择,例如一次一百万行(或考虑到嵌套浮点数的大小任何合理的行)。

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

编辑

所以在评论之后,我想最好的方法是一次将每个分区多行.Q.ind

于 2015-02-09T10:47:10.690 回答
1

我认为这只是自由 32 位内存限制、行数可能很大的事实以及(不可避免地)在从列中检索数据时必须将某些东西完全拉入内存的事实,无论是被完全拉入的列本身(在非嵌套情况下),或者如果它的嵌套索引列被完全拉入。

要考虑的另一件事是 kdb 使用二次幂(伙伴)内存分配。即使今天的表只比昨天多一行,每列的内存需求也可能翻倍。举个简单的例子:

在免费的 32 位版本(windows)中,您可以创建这么多浮点数,它只使用 ~1.07gb 的内存

q)\ts 134217726?1.0
3093 1073741952

但是,尝试生成一个额外的浮点数并达到内存限制

q)\ts 134217727?1.0
wsfull

因此,如果您接近 2 的可分配幂的边界,即使是一天与下一天之间差异的少量行也可能非常重要。

--免责声明--以下内容是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 在幕后所做的,所以我怀疑即使首先读取嵌套索引文件,您仍然会遇到麻烦。

检查这个调试/黑客,看看你是否可以部分阅读这种方式。但显然这不是长久之计!

于 2015-02-12T19:28:52.063 回答
0

只是为了给我 2 美分,我遇到了类似的错误,但使用的是 64 位实例。

  • 我怀疑内存需要进行碎片整理,因为它运行了将近一年。

  • 弹回实例解决了这个问题,并释放了大量的虚拟内存

于 2018-09-17T10:09:29.433 回答