0

我已经看到了一种使用 an 的技术update(我猜主要是为了添加新列的副作用)update someFun each t from t:. 使用这种技术是好还是坏?

一些实验:

t1:([]a:1 2);
t2:([]a:1 2;b:30 40);
update s:{(x`a)+x`b} each t2 from t1

似乎我们可以使用不同的表来做到这一点,所以我猜我们会有 2 倍的内存过度使用。

但:

t:([]a:til 1000000;b:-1*til 1000000);
\ts:10 s0: update s:{(x`a)+x`b} each t from t;
4761 32778560

\ts:10 s1: update s:{(x`a)+x`b} each ([]a;b) from t;
4124 32778976

\ts:10 s2: update s:{x+y}'[a;b] from t;
1908 32778512

对于所有内存情况,给出几乎相同的结果。我想知道为什么内存消耗是一样的

4

2 回答 2

2

在所有示例中,您都在表的行上“遍历”,并且似乎内存消耗是增量构建向量(多个内存块分配)而不是一次性构建的结果。尽可能使用向量运算

q)n:5000000;t:([]a:til n;b:-1*til n)
q)
q)// each row
q)\ts update s:{(x`a)+x`b} each t from t;
1709 214218848
q)v:n#0
q)\ts {x}each v
361 214218256
q)
q)// vector op
q)\ts update s:sum a b from t;
18 67109760
q)\ts til n
5 67109040
于 2020-10-18T14:12:14.297 回答
1

实际上它已经使用了 2 倍的内存。t 的大小为 16 M,-22!t 使用的内存为 32 M

于 2020-10-18T12:16:52.750 回答