Почему база данных CoreData удваивается в размере после сохранения без внесения каких-либо изменений? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть простой код, который сохраняет изображение (и некоторые другие значения), хранящиеся в 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 сохранений. Это стандартное поведение? Это создает ненужное пустое пространство по какой-то причине?

1 Ответ

2 голосов
/ 30 апреля 2020

Трудно ответить на Почему вопросы. Вы видели какую-то конкретную проблему с использованием Core Data? Увеличение размера памяти или отдельного файла, как описано в вашем посте, не является ни сбоем, ни проблемой, но если размер памяти или файла будет увеличиваться непрерывно без видимой причины, это будет сбоем. Если вы сомневаетесь, вы можете проверить, правильно ли работают Core Data, код вашего приложения и SQLite: откройте файл SQLite с помощью клиента SQLite и введите команду VACUUM. Закройте клиент SQLite и проверьте размер файла, затем повторите команды Core Data (но не добавляйте новые данные) в свое приложение и снова введите VACUUM через клиент SQLite. Размер файла не должен был быть изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...