The .m namespace¶
Since V4.0 2020.03.17
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.