Realm 写入对于大数据集非常慢并且行为异常

问题描述

领域版本 - 10.4.0

以下是我在项目中使用的主要领域模型类。所有这些模型都具有最多 1-2 层嵌入对象或领域模型的嵌套。

大约 10k 个条目

open class MemberRO(
    @PrimaryKey
    var uid: String = "",var id: String = "",var name: String = "",var imageUrl: String = "",var state: Int = 0,var removeState: Int? = null,var customIntroText: String? = null,var customClickText: String? = null,var customTitle: String? = null,var chatroomId: Int? = null,var communityId: Int? = null,var isOwner: Boolean? = null,var community: CommunityRO? = null,var chatroom: CollabcardRO? = null
) : RealmObject()

大约 1k 个条目

open class CommunityRO(
    @PrimaryKey
    var id: Int = 0,@required
    var name: String = "",var membersCount: Int = -1,var pendingMembersCount: Int = -1,var collabcardsUnseen: Int = -1,var imageURL: String? = null,var purpose: String? = null,var about: String? = null,var updatedAt: String? = null,var memberState: Int? = null,var type: Int? = null,var subType: Int? = null,var clickState: Int? = null,var actions: RealmList<CommunityActionRO> = RealmList(),var pendingChatRoomCount: Int = 0,var openReportsCount: Int = 0,var memberRightStates: RealmList<Int> = RealmList(),var orderTime: Long? = null,var pinnedSubTitle: String? = null,var canShowPinnedBanner: Boolean? = null,var conversations: RealmList<CollabcardAnswerRO>? = null,var chatrooms: RealmList<CollabcardRO>? = null,var relationshipNeeded: Boolean = true
) : RealmObject()

大约 100k-200k 条目

open class CollabcardAnswerRO(
    @PrimaryKey
    var id: String = "",var chatroomId: Int = 0,var communityId: Int = 0,var member: MemberRO? = null,@required
    var answer: String = "",var createdEpoch: Long = 0L,var createdAt: String? = null,var attachments: RealmList<AttachmentRO> = RealmList(),var lastSeen: Boolean = false,var link: LinkRO? = null,var date: String? = null,var isEdited: Boolean? = null,var preview: PreviewRO? = null,var replyConversationId: String? = null,var replyConversation: CollabcardAnswerRO? = null,var deletedBy: String? = null,var attachmentCount: Int? = null,var attachmentsuploaded: Boolean? = null,var uploadWorkerUUID: String? = null,var localSavedEpoch: Long = 0L,var temporaryId: String? = null,var reactions: RealmList<MessageReactionRO> = RealmList(),@LinkingObjects("conversations")
    val community: RealmResults<CommunityRO>? = null,@LinkingObjects("conversations")
    val chatroom: RealmResults<CollabcardRO>? = null
) : RealmObject()

大约 20k 个条目

open class CollabcardRO(
    @PrimaryKey
    var id: Int = 0,@required
    var title: String = "",var state: Int? = null,var answerText: String? = null,var shareUrl: String? = null,var dateTime: Long? = null,var endDate: Long? = null,var polls: RealmList<PollRO> = RealmList(),var pollsCount: Int? = null,var attendingCount: Int? = null,var location: String? = null,var locationLat: Double? = null,var locationLong: Double? = null,var coHosts: RealmList<MemberRO> = RealmList(),var onlineLink: String? = null,var header: String? = null,var cardCreationTime: String? = null,var totalResponseCount: Int = 0,var multipleSelectNum: Int? = null,var multipleSelectState: Int? = null,var muteStatus: Boolean? = null,var followStatus: Boolean? = null,var creatorShareUrl: String? = null,var hasBeenNamed: Boolean? = null,var isGuest: Boolean? = null,var lastFiveUniqueMembers: RealmList<MemberRO> = RealmList(),var pollType: Int? = null,var pollTypeText: String? = null,var submitTypeText: String? = null,var expiryTime: Long? = null,var isAnonymous: Boolean? = null,var allowAddOption: Boolean? = null,var isTagged: Boolean? = null,var isPending: Boolean? = null,var chatroomExpiryTime: Long? = null,var isDraft: Boolean? = null,var updatedAt: Long? = null,var lastConversation: CollabcardAnswerRO? = null,var lastSeenConversationId: Int? = null,var lastSeenConversation: CollabcardAnswerRO? = null,var dateEpoch: Long? = null,var unseenCount: Int = 0,var relationshipNeeded: Boolean = true,var draftConversation: String? = null,var isSecret: Boolean? = null,var secretChatRoomParticipants: RealmList<Int> = RealmList(),var secretChatRoomLeft: Boolean? = null,@LinkingObjects("chatrooms")
    val communities: RealmResults<CommunityRO>? = null
) : RealmObject()

读取工作非常快,并且由于反向关系,数据在 50 毫秒内查询。 但是写事务非常非常慢。

对于如下所示的非常简单的写入事务,需要 > 20 秒才能完成。

realm.executeTransactionAsync { bgRealm ->
    val conversation = bgRealm.where(CollabcardAnswerRO::class.java)
        .equalTo("id","123").findFirst()
    conversation?.answer = "Hello"
}

我使用日志检查了事务,发现写入事务块在

此外,我发现一件有趣的事情,如果我通过在协程 IO 调度程序中调用没有异步的 executeTransaction 来执行相同的写事务,它会将写事务加速到 5-10 秒。但还是5-10秒不好。

此外,我尝试删除任何通知侦听器,因为差异检查需要时间,但这并没有多大帮助。另外,我的写交易没有被其他交易阻止,我已经确认了这一点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)