So the initial approach was to allocate a fixed buffer, exceeding the max deserialized block allocation requirement, on each thread. This is easy, just create the allocator on a thread static. Since the calls are infrequent (once per block) this is low contention (C++ must still sequence the thread static).