add a more precise preallocation