【问题标题】:How does q cache data?q如何缓存数据?
【发布时间】:2013-10-08 07:16:51
【问题描述】:

我试图测量我创建的数据库的数据访问时间。一天的数据大约需要 1 秒。为了汇总,我运行了以下代码。我正在使用 kdb studio,每天总共有 ~1MM 的交易

\t ans: raze {select from trade where date=x, sym=`ABC} each 20#dtl

dtl 是整个日期列表。我关闭了服务器并再次运行它,令人惊讶的是这花了不到 1 秒。由于这与我在上面观察到的相反,我运行了这个

\t ans: raze {select from trade where date=x, sym=`ABC} each 20#20_dtl

现在花了大约 21 秒。我的问题是,如果我关闭 kdb 服务器,q 是否仍然可以缓存之前的一些结果?

【问题讨论】:

  • 当你说你关闭了服务器时,你的意思是你断开了连接然后重新连接,还是你真的杀死了你的 HDB 然后重新启动它?
  • 杀死了我的 HDB 并重新开始,但好点 :)。会不会是操作系统页面文件/缓存问题?

标签: kdb


【解决方案1】:

这可能是由于您的操作系统缓存了它从磁盘读取的数据。 Kdb+ 默认不提供内置缓存。

【讨论】:

  • 这也是我的猜测,但除非有某种方法可以确定这只是猜测。也可能是别的东西
  • 如果它是一个 linux 机器,并且你有特权访问 (root/sudo) 可以使用以下命令来刷新 + 清除缓存:sync ; sudo echo 3 | sudo tee /proc/sys/vm/drop_caches
【解决方案2】:

KDB+ 不缓存任何内容。如果您看到这样的速度差异,这都是硬件缓存。如果刷新缓存,您可以确认这一点(在 unix 系统中,有一组命令可以执行此操作,但您需要 root 访问权限)。底线是 KDB+ 根本不做任何缓存。 (除非你告诉它当然...... a la .Q.fu)

顺便说一句,不确定您的查询在这里是如何工作的 - 20#dtl 将给出日期列表,然后 date=x 会给出长度错误。我假设您的意思是“x 中的日期”。在这种情况下,如果您在命令行上使用 -s,您可能会因为多线程而得到偏斜的结果。

【讨论】:

  • 我正在为 dtl 做一个 each
  • 在 linux 中检查过。它的硬件缓存。您可以通过重新启动 kdb 并执行 sync and echo 3 > /proc/sys/vm/drop_caches` 来检查
猜你喜欢
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多