【问题标题】:What could be causing this 'invalid host' error on kdb query?什么可能导致 kdb 查询出现此“无效主机”错误?
【发布时间】:2018-05-08 14:25:25
【问题描述】:

尝试从日期分区的历史数据库中查询太多日期时出现奇怪的错误:

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 文档中没有看到任何有关大小限制的相关信息。有人有什么想法吗?

编辑:

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

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 消息,但是我该怎么办呢?

编辑摘要/解决方案:

有问题的表有很多列,所有列都以压缩格式存储。当一次对太多日期发出查询时,kdb 会尝试一次映射所有这些列,从而限制了一次可以打开多少压缩文件。

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

  1. 我只能从数据库中提取某些列,从而减少 kdb 需要保持打开状态的文件数量,
  2. 我可以通过在查询中添加一个虚拟的 where 子句来强制 kdb 将所有数据拉入内存,例如 (null column) | not null column(很老套,但它有效),
  3. 我本可以升级 kdb 版本并取消操作系统限制(在我的情况下不实用)。

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

【问题讨论】:

    标签: kdb


    【解决方案1】:

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

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

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

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

    您还可以尝试使用列的子集执行原始查询,再次尝试查明问题的根源。

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

    约瑟夫

    【讨论】:

    • 感谢您的回复:我确实混淆了我的术语,并且该表是按日期划分的,任何列上都没有其他属性。直接从数据库读取时我遇到了同样的问题,所以这不是 IPC 的问题。我用一些额外的信息编辑了我的问题。任何进一步的建议都会很棒,谢谢。
    • 来自 KDB 食谱的页面:“Q) 可以同时打开的压缩文件的数量是否有限制?A) 对于 v3.1 2013.02.21 之前的版本,限制是4096 个文件;此后的版本仅受环境/操作系统的限制(例如 ulimit -n)。未压缩文件的数量没有实际的内部限制。因此,如果您在 Linux 环境中工作,则可以使用 ulimit -n删除导致此问题的限制。
    • @Jedwards 考虑使用最终解决方案编辑您的实际答案,以便将来搜索此问题的任何人更容易找到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2011-07-02
    • 2012-01-15
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多