I wish to keep sym file small. How can I find out if I will be introducing a new symbol before splaying the data out to disk?
You can detect if the use of a symbol will increased the total number of interned symbols in the pool using .Q.w:
$ rlwrap q
KDB+ 2.7 2011.02.16 Copyright (C) 1993-2011 Kx Systems
q).Q.w[]
used| 108432
heap| 67108864
peak| 67108864
wmax| 0
mmap| 0
syms| 537
symw| 15616
q)`1 // force kdb to internalize a new symbol
`1
q).Q.w[]
used| 108432
heap| 67108864
peak| 67108864
wmax| 0
mmap| 0
syms| 538 // increased by 1
symw| 15634 // increase of +18 bytes
q)`12 // force kdb to internalize another
`12
q).Q.w[]
used| 108432
heap| 67108864
peak| 67108864
wmax| 0
mmap| 0
syms| 539 // increase by 1
symw| 15653 // increase of 19 bytes
q)`123
`123
q).Q.w[]
used| 108432
heap| 67108864
peak| 67108864
wmax| 0
mmap| 0
syms| 540 // increase by 1
symw| 15673 // increase of 20 bytes
q)
See this solution to compacting a bloated sym file