在kdb中使用.Q.w的内存统计的效率

在kdb中使用.Q.w的内存统计的效率,kdb,Kdb,为了获得内存统计信息,我们在kdb中使用.Q.w[]。 .Q.w的输出如下 q).Q.w[] used| 260928 heap| 67108864 peak| 67108864 wmax| 0 mmap| 0 mphy| 270267293696 syms| 1287 symw| 57285 我已经编写了类似的词典,提供了与.Q.w相同的输出 q)`used`heap`peak`wmax`mmap`mphy`syms`symw!(value["\\w"], value ["\\w 2"])

为了获得内存统计信息,我们在kdb中使用.Q.w[]。 .Q.w的输出如下

q).Q.w[]
used| 260928
heap| 67108864
peak| 67108864
wmax| 0
mmap| 0
mphy| 270267293696
syms| 1287
symw| 57285
我已经编写了类似的词典,提供了与.Q.w相同的输出

q)`used`heap`peak`wmax`mmap`mphy`syms`symw!(value["\\w"], value ["\\w 2"])
在测试中,我可以看到我的字典运行速度比.Q.w[]快
少数样本:

    q)\t:100000 .Q.w[]
    44
    q)\t:100000 `used`heap`peak`wmax`mmap`mphy`syms`symw!(value["\\w"], value ["\\w 2"])
    42
    q)\t:1000000 .Q.w[]
    451
    q)\t:1000000 `used`heap`peak`wmax`mmap`mphy`syms`symw!(value["\\w"], value ["\\w 2"])
    407
    q)\t:1500000 .Q.w[]
    662
    q)\t:1500000 `used`heap`peak`wmax`mmap`mphy`syms`symw!(value["\\w"], value ["\\w 2"])
    613
    q)\t:2000000 .Q.w[]
    860
    q)\t:2000000 `used`heap`peak`wmax`mmap`mphy`syms`symw!(value["\\w"], value ["\\w 2"])
    813
    q)\t:2500000 `used`heap`peak`wmax`mmap`mphy`syms`symw!(value["\\w"], value ["\\w 2"])
    999
    q)\t:2500000 .Q.w[]
    1071

我的问题是,除了在.Q.w函数中使用的(点运算符),使用值函数是否更有效

考虑到差异有多小,我怀疑这可能只是运行lambda/函数与不运行lambda/函数的开销

q)\t:2500000 1+1
129
q)\t:2500000 {1+1}[]
165

另外-我不确定
value[“\\w 2”]
是否在做您认为它在做的事情。要复制
.Q.w
,您应该通过
0
1
。。。。。传递
2
是试图将工作区限制调整为2mb

鉴于差异非常小,我怀疑这可能只是运行lambda/函数与不运行lambda/函数的开销

q)\t:2500000 1+1
129
q)\t:2500000 {1+1}[]
165

另外-我不确定
value[“\\w 2”]
是否在做您认为它在做的事情。要复制
.Q.w
,您应该通过
0
1
。。。。。传递
2
是试图将工作区限制调整为2mb

Terry是正确的,这只是lambda的开销。我只想回答这部分问题

使用除(点运算符)以外的值函数是否更有效 Q.w函数中使用了哪一个

value
/
get
.Q.w
定义中的点运算符本质上是相同的

q)get
.:
q)value
.:
在这里,我们可以忽略
get
value
定义的尾随冒号。我们可以通过将这些定义包装在括号中以获得
k
功能,或者放入
k
语言来检查这是否是事实

q)(.)"\\w"
343584 67108864 67108864 0 0 17054650368
q)(.:)"\\w"
343584 67108864 67108864 0 0 17054650368
q)\
  ."\\w"
343584 67108864 67108864 0 0 17054650368
事实上。。。我们可以添加任意数量的内容!无论如何,解析器都会将其分解为一个

q)(.::)"\\w"
343584 67108864 67108864 0 0 17054650368
q)(.:::::::::::::::::::::::::::::::::)"\\w"
343616 67108864 67108864 0 0 17054650368
q)parse ".:::"
.:

从内存来看,在
之后使用冒号迫使重载的
以一元形式运行。特里说得对,这只是兰姆达的开销。我只想回答这部分问题

使用除(点运算符)以外的值函数是否更有效 Q.w函数中使用了哪一个

value
/
get
.Q.w
定义中的点运算符本质上是相同的

q)get
.:
q)value
.:
在这里,我们可以忽略
get
value
定义的尾随冒号。我们可以通过将这些定义包装在括号中以获得
k
功能,或者放入
k
语言来检查这是否是事实

q)(.)"\\w"
343584 67108864 67108864 0 0 17054650368
q)(.:)"\\w"
343584 67108864 67108864 0 0 17054650368
q)\
  ."\\w"
343584 67108864 67108864 0 0 17054650368
事实上。。。我们可以添加任意数量的内容!无论如何,解析器都会将其分解为一个

q)(.::)"\\w"
343584 67108864 67108864 0 0 17054650368
q)(.:::::::::::::::::::::::::::::::::)"\\w"
343616 67108864 67108864 0 0 17054650368
q)parse ".:::"
.:

从内存来看,在
之后使用冒号迫使重载的
以一元形式运行。因为lambda,这是一项开销。因为lambda,这是一项开销。