Select a table from the inside of external select

114 Views Asked by At

I've seen a technique of use an update (mainly for side-effect of adding a new column, I guess) in a way of: update someFun each t from t. Is it good or bad practice to use such technique?

Some experiments:

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

Seems we can use different tables to do this, so I guessed we'll have 2x memory over-use.

But:

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

gives almost the same result for all cases for memory. I wonder why memory consumptions are the same?

2

There are 2 best solutions below

0
On BEST ANSWER

In all examples you're 'eaching' over rows of the table & it seems the memory consumption is a result of building up the vector incrementally (multiple memory block allocations) rather than in one go. Use vector operations whenever possible

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
0
On

Actually it's already 2x memory used. Size of t is 16 M from -22!t And memory used is 32 M