refactor data_allocate()