首页 文章

什么可能导致kdb查询'invalid host'错误?

提问于
浏览 1256
3

尝试从日期分区的历史数据库中查询太多日期时,我收到一个奇怪的错误:

q)eod: h"select from eod where date within 2018.01.01 2018.04.22"
'/tablepath/2018.04.04/eod/somecolumn: invalid host
q)eod: h"select from eod where date within 2018.01.17 2018.04.20"
'/tablepath/2018.04.20/eod/othercolumn: invalid host
q)eod: h"select from eod where date within 2018.01.18 2018.04.20"
q)

请注意,错误消息中提到的两个日期都在我们最终设法提取的日期范围内,并且每次都在不同的列上失败 . 这似乎表明它与被拉表的大小有关,但是当我们检查我们设法获得的最大表的大小时:

q)(-22!eod) % 1024 * 1024
646.9043
q)count eod
2872546

我们发现它的内存大小和行数都不是特别大 .

谷歌搜索“无效主机”错误似乎没有出现任何相关的问题,我在kdb文档中没有看到任何与相关的大小限制相关的内容 . 有人有任何想法吗?

Edit:

在会话中加载表并直接进行查询时,我们会得到看似相同的错误,但使用不同的消息 . 例如:

q)jj: select from eod where date within 2018.01.01 2018.04.22
Too many compressed files open
k){0!(?).@[x;0;p1[;y;z]]}
'./2018.04.04/eod/settlecab: No such file or directory
.
?
(+`exch`date`class..
q.Q))

请注意,文件 ./2018.04.04/eod/settlecab 确实存在,并且包含数据:我在加载错误中提到的日期的数据时没有问题,并且提到的列具有有意义的值:

q)jj: select from eod where date=2018.04.04
q)select count i by settlecab from jj
settlecab| x    
---------| -----
0        | 41573
1        | 2269

关键点似乎是 Too many compressed files open 消息,但我该怎么办呢?

Edit for Summary/Solutions:

有问题的表有很多列,都以压缩格式存储 . 当一次针对太多日期发出查询时,kdb会尝试同时对所有这些列进行mmap,从而限制一次打开多少个压缩文件 .

一旦我理解了这个问题,就有几个解决方案:

  • 我只能从数据库中提取某些列,减少了kdb保持打开所需的文件数量,

  • 我可以通过在查询中添加一个伪 where 子句来强制kdb将所有数据拉入内存,例如 (null column) | not null column (hacky,但它有效),

  • 我本可以升级kdb版本并解除操作系统限制(在我的情况下不实用) .

我仍然不知道为什么这会在远程查询数据库时导致 invalid host 错误 .

1 回答

  • 6

    首先,我们可以澄清您正在使用的数据库结构 . 从您的错误中返回的文件路径看来,您有一个日期分区数据库 . 当您在原始查询中说未分区时,您的意思是非分段数据库吗?

    就您的问题的修复而言,您是否尝试将数据库加载到会话中,并直接进行这些查询?如果是这样,你会得到同样的问题吗?

    如果这似乎工作正常,问题可能在于您如何定义数据库句柄 . 如何在原始示例中定义 h

    也可能值得尝试从数据库中选择单个日期,尝试隔离问题,并确定它是否与您的磁盘数据有关 . 尝试专门查询错误中提到的日期 .

    您还可以尝试使用列的子集执行原始查询,再次尝试确定问题的来源 .

    如果您对此有任何进一步了解,请告诉我们 .

    约瑟夫

相关问题