22.10. Compressed storage of short arrays
Neo4j will try to store your primitive arrays in a compressed way, so as to save disk space and possibly an I/O operation. To do that, it employs a "bit-shaving" algorithm that tries to reduce the number of bits required for storing the members of the array. In particular:
- For each member of the array, it determines the position of leftmost set bit.
- Determines the largest such position among all members of the array
- It reduces all members to that number of bits
- Stores those values, prefixed by a small header.
That means that when even a single negative value is included in the array then the natural size of the primitives will be used.
There is a possibility that the result can be inlined in the property record if:
- It is less than 24 bytes after compression
- It has less than 64 members
For example, an array long[] {0L, 1L, 2L, 4L} will be inlined, as the largest entry (4) will require 3 bits to store so the whole array will be stored in 4*3=12 bits. The array long[] {-1L, 1L, 2L, 4L} however will require the whole 64 bits for the -1 entry so it needs 64*4 = 32 bytes and it will end up in the dynamic store.