У меня есть простой код, который сохраняет изображение (и некоторые другие значения), хранящиеся в NSMutableDictionary и миниатюру изображения в CoreData:
self.imageInfo.lastSaved = [NSDate date];
self.imageInfo.thumbnail = UIImageJPEGRepresentation([self imageThumbnail], JPEGCompressionQuality);
if (!self.imageInfo.details)
{
self.imageInfo.details = [NSEntityDescription insertNewObjectForEntityForName:@"ImageDetails" inManagedObjectContext:[self managedObjectContext]];
}
self.imageInfo.details.values = [self imageValues];
NSError *error;
[[self managedObjectContext] save:&error];
Я проверил, что изображение составляет 2,1 МБ (и миниатюра только 11 кб). Все остальные данные - это просто CGFloats или короткие строки. Когда я сохраняю первый раз, кажется, что все в порядке, когда я просматриваю файлы базы данных в Документах и каталоге:
- Image_Producer.sqlite 37 КБ
- Image_Producer.sqlite-shm 33 КБ
- Image_Producer.sqlite-wal 2,1 КБ
Однако при повторном сохранении без изменения я получаю:
- Image_Producer.sqlite 4,2 КБ
- Image_Producer.sqlite-shm 33 КБ
- Image_Producer.sqlite-wal 4,3 МБ
Я подтвердил, что размер изображения и размер миниатюр остаются одинаковыми. После пяти сохранений я получаю:
- Image_Producer.sqlite 4,2 МБ
- Image_Producer.sqlite-shm 33 КБ
- Image_Producer.sqlite-wal 3,3 КБ
Я не понимаю колебания размеров, когда я ничего не меняю. Похоже, что база данных увеличилась в четыре раза после второго сохранения, а затем возвращается к удвоению только после первых 5 сохранений. Я не понимаю, что здесь происходит.
ОБНОВЛЕНИЕ: При анализе базы данных с использованием sqlite3_analyzer я вижу, что полезный груз имеет правильный размер, но размер файла sqlite в два раза больше, чем полезный груз после 5 сохранений. Это стандартное поведение? Это создает ненужное пустое пространство по какой-то причине?