2016-07-14 4 views
0

Я пишу приложение iOS, в котором хранятся сайты. Каждый из сайтов имеет другой адрес. Для теста я создал 32k-сайты, а также 32k-адреса. Когда я впервые создал все эти datapoint, файл realm занял около 9 гб данных. Чтобы быть уверенным в объеме пространства, которое требуется для хранения этих данных, я повторно запускаю тест несколько раз.Realm Размер файла зависит от того, какие данные сохраняются

Каждый раз, когда я запускал эти тесты, размер файла был другим, в диапазоне от 25 до 10 гб. Однако я не уверен, какая проблема. Есть ли какие-то предложения, которые я мог бы найти?

+0

Вы не закрываете свой экземпляр Realm в фоновом потоке. Вы можете * использовать несколько транзакций вместо одной транзакции. – EpicPandaForce

+0

@EpicPandaForce вы отчасти правы. Я действительно использовал несколько транзакций, но, насколько мне известно, нет возможности закрыть экземпляр области в swift – TheKringar

+0

@EpicPandaForce Не могли бы вы объяснить мне, почему размер становится таким большим и таким случайным в этом случае. Потому что, поскольку я думал, что это не имеет значения, пишу ли я в нескольких транзакциях или просто в одном? – TheKringar

ответ

1

Я более хорошо разбираюсь в Realm-java, чем в Realm-Swift, но если вы сохраните старые экземпляры Realm, которые принадлежат к потокам без цикла, которые не могут обновить себя (в стремительном мире, по-видимому, это фоновые потоки и отправка очереди), вам нужно закрыть экземпляр Realm, а в swift вам необходимо обернуть ваше Realm в autoreleasepool, чтобы автоматически закрыть его. Вот что относится к этому вопросу documentation.

Промежуточные версии данных в файле Realm нельзя использовать повторно до тех пор, пока объект Realm не будет удален. Чтобы избежать этой проблемы, вы должны использовать явный пул автозапуска при доступе к царству из очереди отправки.

Я также думаю, что это помогает, если вы уменьшите количество транзакций, выполняемых в заданной фоновой цепочке.

Старые версии, которые заканчиваются тем, что они удерживаются, занимают дополнительное пространство, его можно уплотнять, используя compactRealm. Для этого все экземпляры Королевства должны быть закрыты для каждого потока.

+0

Спасибо за объяснение, что мне очень помогает – TheKringar

2

Если размер файла значительно превышает объем данных, которые вы храните, вероятно, вы столкнулись с проблемой version pinning.

Версия pinning - это когда экземпляр Realm находится вокруг намного дольше, чем ожидалось, в то время как другие потоки записывают новые данные. Экземпляр A Realm сохраняет в памяти версию данных, которые она просматривает, пока она не будет освобождена или обновлена ​​до последней версии. Если один поток записывает данные в Realm, а другой поток имеет экземпляр Realm, открытый в более старой версии, новые данные не могут перезаписывать старые, и поэтому размер файла заканчивается. Когда экземпляр Realm освобождается или продвигается к текущей версии, пространство для более старых версий в файле Realm помечено как свободное и может быть повторно использовано для последующей записи.

Общей ситуацией, которая может привести к закреплению версии, является использование Realm в очередях отправки, а экземпляр Realm попадает в пул автоопределения очереди отправки. Очереди диспетчеризации истощают свои пулы авторефератов относительно редко, что может привести к тому, что срок действия экземпляра Realm будет значительно дольше, чем вы могли ожидать. Чтобы избежать этого класса проблем, мы предлагаем, чтобы вся работа с Realm в диспетчерских очередях была явно завершена в пулы автозапуска. Это обеспечит своевременное предоставление экземпляров Realm.

+0

Ответ на самом деле тоже прав, но, к сожалению, я не могу принять два, а так как другой был первым, я принял это – TheKringar

Смежные вопросы