什么可能导致 kdb 查询出现此 'invalid host' 错误?
What could be causing this 'invalid host' error on kdb query?
我在尝试从日期分区的历史数据库中查询太多日期时遇到一个奇怪的错误:
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)
请注意,错误消息中提到的两个日期都在我们最终设法提取的日期范围内,并且每次都在不同的列上失败。这似乎表明它与被拉动的 table 的大小有关,但是当我们检查最大的 table 的大小时,我们设法得到:
q)(-22!eod) % 1024 * 1024
646.9043
q)count eod
2872546
我们发现无论是内存大小还是行数,它都不是特别大。
谷歌搜索 "invalid host" 错误似乎没有发现任何相关信息,而且我在 kdb 文档中没有看到任何相关的大小限制。有人有什么想法吗?
编辑:
在会话中加载 table 并直接进行查询时,我们得到了看似相同的错误,但消息不同。例如:
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
消息,但是我该怎么办?
为 Summary/Solutions 编辑:
有问题的 table 有很多列,所有列都以压缩格式存储。当一次针对太多日期发出查询时,kdb 会尝试一次映射所有这些列,运行 限制一次可以打开多少压缩文件。
一旦我理解了这个问题,就有了几个可用的解决方案:
- 我只能从数据库中提取某些列,减少 kdb 需要保持打开状态的文件数量,
- 我可以通过在查询中添加一个虚拟
where
子句来强制 kdb 将所有数据拉入内存,例如 (null column) | not null column
(hacky,但它有效),
- 我本可以升级 kdb 版本并取消 OS 限制(对我来说不实用)。
我仍然不知道为什么在远程查询数据库时会导致 invalid host
错误。
首先,我们能否澄清一下您正在使用的数据库结构。从错误中返回的文件路径看来,您有一个日期分区的数据库。当您在原始查询中说非分区时,您是指非分段数据库吗?
就您的问题的修复而言,您是否尝试过将数据库加载到会话中并直接进行这些查询?如果是这样,你会遇到同样的问题吗?
如果这似乎工作正常,问题可能出在您定义数据库句柄的方式上。 h
在您的原始示例中是如何定义的?
可能还值得尝试从您的数据库中 select 个别日期,尝试隔离问题,并确定它是否与您的磁盘数据有关。尝试专门查询错误中提到的日期。
您也可以尝试使用列的子集执行原始查询,再次尝试查明问题的来源。
如果您对此有任何进一步了解,请告诉我们。
约瑟夫
我在尝试从日期分区的历史数据库中查询太多日期时遇到一个奇怪的错误:
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)
请注意,错误消息中提到的两个日期都在我们最终设法提取的日期范围内,并且每次都在不同的列上失败。这似乎表明它与被拉动的 table 的大小有关,但是当我们检查最大的 table 的大小时,我们设法得到:
q)(-22!eod) % 1024 * 1024
646.9043
q)count eod
2872546
我们发现无论是内存大小还是行数,它都不是特别大。
谷歌搜索 "invalid host" 错误似乎没有发现任何相关信息,而且我在 kdb 文档中没有看到任何相关的大小限制。有人有什么想法吗?
编辑:
在会话中加载 table 并直接进行查询时,我们得到了看似相同的错误,但消息不同。例如:
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
消息,但是我该怎么办?
为 Summary/Solutions 编辑:
有问题的 table 有很多列,所有列都以压缩格式存储。当一次针对太多日期发出查询时,kdb 会尝试一次映射所有这些列,运行 限制一次可以打开多少压缩文件。
一旦我理解了这个问题,就有了几个可用的解决方案:
- 我只能从数据库中提取某些列,减少 kdb 需要保持打开状态的文件数量,
- 我可以通过在查询中添加一个虚拟
where
子句来强制 kdb 将所有数据拉入内存,例如(null column) | not null column
(hacky,但它有效), - 我本可以升级 kdb 版本并取消 OS 限制(对我来说不实用)。
我仍然不知道为什么在远程查询数据库时会导致 invalid host
错误。
首先,我们能否澄清一下您正在使用的数据库结构。从错误中返回的文件路径看来,您有一个日期分区的数据库。当您在原始查询中说非分区时,您是指非分段数据库吗?
就您的问题的修复而言,您是否尝试过将数据库加载到会话中并直接进行这些查询?如果是这样,你会遇到同样的问题吗?
如果这似乎工作正常,问题可能出在您定义数据库句柄的方式上。 h
在您的原始示例中是如何定义的?
可能还值得尝试从您的数据库中 select 个别日期,尝试隔离问题,并确定它是否与您的磁盘数据有关。尝试专门查询错误中提到的日期。
您也可以尝试使用列的子集执行原始查询,再次尝试查明问题的来源。
如果您对此有任何进一步了解,请告诉我们。
约瑟夫