mmap() 失败:无法在 RealmSwift 2.10.2 上分配内存大小:268435456 偏移量:2684354560
mmap() failed: Cannot allocate memory size: 268435456 offset: 2684354560 on RealmSwift 2.10.2
我的领域增长如此之快,所以我对内存分配大小有一个例外。我的领域大小约为 3.2 GB,因此我将此领域的配置用于解决此问题:
let config = Realm.Configuration(
// Set the new schema version. This must be greater than the previously used
// version (if you've never set a schema version before, the version is 0).
schemaVersion: 11,
// Set the block which will be called automatically when opening a Realm with
// a schema version lower than the one set above
migrationBlock: { migration, oldSchemaVersion in
},shouldCompactOnLaunch: {totalBytes, usedBytes -> Bool in
guard totalBytes > 10 * 1024 * 1024 * 1024 else { return false }
guard Double(usedBytes) / Double(totalBytes) < 0.5 else { return false }
print("Should compact Realm database: \(usedBytes) / \(totalBytes)")
return true
})
Realm.Configuration.defaultConfiguration = config
但是,问题仍然存在。我做错了什么?
此致
我猜你在 dispatch async
方法中缺少 autoreleasepool
。
documentation 表明您应该这样做。
// Query and update from any thread
DispatchQueue(label: "background").async {
autoreleasepool { // <-- !!!
let realm = try! Realm()
let theDog = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
theDog!.age = 3
}
}
}
当然,另一种可能性是您多次插入大约 100000 个对象,而没有将它们分成大约 1000 个的批次。
另一种可能性是将每个项目插入其自己的事务中。
像这样,超大的交易可以分配很多space,但是每一项插入一个项目也占用很多space,所以中间立场。
我的领域增长如此之快,所以我对内存分配大小有一个例外。我的领域大小约为 3.2 GB,因此我将此领域的配置用于解决此问题:
let config = Realm.Configuration(
// Set the new schema version. This must be greater than the previously used
// version (if you've never set a schema version before, the version is 0).
schemaVersion: 11,
// Set the block which will be called automatically when opening a Realm with
// a schema version lower than the one set above
migrationBlock: { migration, oldSchemaVersion in
},shouldCompactOnLaunch: {totalBytes, usedBytes -> Bool in
guard totalBytes > 10 * 1024 * 1024 * 1024 else { return false }
guard Double(usedBytes) / Double(totalBytes) < 0.5 else { return false }
print("Should compact Realm database: \(usedBytes) / \(totalBytes)")
return true
})
Realm.Configuration.defaultConfiguration = config
但是,问题仍然存在。我做错了什么?
此致
我猜你在 dispatch async
方法中缺少 autoreleasepool
。
documentation 表明您应该这样做。
// Query and update from any thread
DispatchQueue(label: "background").async {
autoreleasepool { // <-- !!!
let realm = try! Realm()
let theDog = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
theDog!.age = 3
}
}
}
当然,另一种可能性是您多次插入大约 100000 个对象,而没有将它们分成大约 1000 个的批次。
另一种可能性是将每个项目插入其自己的事务中。
像这样,超大的交易可以分配很多space,但是每一项插入一个项目也占用很多space,所以中间立场。