The .m namespace

Since V3.7t 20019.10.22

Memory can be backed by a filesystem, allowing use of DAX-enabled filesystems (e.g. AppDirect) as a non-persistent memory extension for kdb+.

Command-line option -m path directs kdb+ to use the filesystem path specified as a separate memory domain. This splits every thread’s heap into two:

domain description
0 regular anonymous memory, active and used for all allocs by default
1 filesystem-backed memory

The .m namespace is reserved for objects in memory domain 1, however names from other namespaces can reference them too, e.g. a:.m.a:1 2 3

\d .m changes current memory domain to 1, causing it to be used by all further allocs. \d .anyotherns sets it back to 0.

.m.x:x ensures the entirety of .m.x is in memory domain 1, performing a deep copy of x as needed. (Objects of types 100h-103h, 112h are not copied and remain in memory domain 0.)

Lambdas defined in .m set current memory domain to 1 during execution. This will nest, since other lambdas don’t change memory domains:

q)\d .myns
q)g:{til x}
q)\d .m
q)w:{system"w"};f:{.myns.g x}
q)\d .
q)x:.m.f 1000000;.m.w` / x allocated in domain 1

Internal function -120!x returns x’s memory domain, currently 0 or 1.

q)-120!'(1 2 3;.m.x:1 2 3)
0 1

System command \w returns memory info for the current memory domain only.

q)value each ("\\d .m";"\\w";"\\d .";"\\w")
::
353968 67108864 67108864 0 0 8589934592
::
354032 67108864 67108864 0 0 8589934592

Command-line option -w limit (M1/m2) is no longer thread-local, but memory domain-local. Command-line option -w, and system command \w set limit for memory domain 0.

Mapped is a single global counter, the same in every thread’s \w.