use NSOutputStream to avoid allocating during save
only call saveCacheInfo periodically