いつもお世話になっております。
swift初心者です。
Xcode 10.2.1
swift 5
realm
で某ゲームのスコア管理アプリを勉強がてら作っています。
問題
realmへの保存の処理で、メモリが増え続け困っています。
約7000件のデータ登録で使用メモリが2Gを超えてしまいます。
処理内容
・アカウント毎にスレッドを立て
HTMLをスクレイピング→バージョン(という単位)毎にrealmに保存
を行っています。
(約1200件×6アカウント)
・上記のスレッドをDispatchGroupでまとめています。
調査したこと
・realm登録処理以外ではメモリ使用量がさほど増えないことは確認しています。
・realmのscoreオブジェクトが件数毎に増えていっているのが原因なのでは・・と思っています。
ソース
アカウント数分 toRivalScore をループしています。
func toRivalScore(iidxId: String) { print("toRivalScore Strat") dispatchGroup.enter() // ライバルスコア取り込みスレッド // アカウント毎に1スレッド // バージョン毎にDB保存 dispatchQueue.async(group: dispatchGroup) { print("toRivalScore Thread Start") print("取り込み対象アカウント" ,iidxId) // スコア用realm let documentDir: NSString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString let scoreRealmPath: String = documentDir.appendingPathComponent("(Const.Realm.scoreFileName).realm") guard let scoreRealm: Realm = try? Realm(fileURL: URL(fileURLWithPath: scoreRealmPath)) else { print("scoreRealm 生成失敗") self.stopFlg = true return } let playStyle: Int = self.myUserDefaults.getPlayStyle() // 対象アカウントスコアデータ全件削除 let result = self.myRealm.getScoreByPlayStyleAndIidxId(playStyle: playStyle, iidxId: iidxId) try? scoreRealm.write { if !result.isEmpty { scoreRealm.delete(result) } } // バージョン数分ループ let versions: Results<Version> = self.myRealm.getAllVersions() for i in 0 ..< versions.count - 1 { let rival: Rival = self.myRealm.getRivalByPlayStyleAndIidxId(playStyle: playStyle , iidxId: iidxId).first ?? Rival() let code: String = rival.code ?? "" // HTML取得 let data: NSData = self.common.postRequest(dataUrl: Const.Url.scoreSeriesRival , postStr: "list=(i)&play_style=(String(describing: playStyle))&s=1&rival=(code)" , cookieStr: self.listVC.cookieStr) // 進捗更新用 var versionName: String = versions[i+1].name ?? "" if i == 0 { versionName = (versions[i].name ?? "") + "&" + versionName } let djName: String = rival.djName ?? "" // HTMLスクレイピング let scoreArray: [Score] = self.parseScorePerVersion(html: String(data: data as Data, encoding: .windows31j) ?? "" , isMyself: false, iidxId: iidxId, djName: djName, versionName: versionName) if self.stopFlg { break } // DB保存 self.saveRivalScore(iidxId: iidxId, scoreArray: scoreArray , scoreRealm: scoreRealm, scoreRealmPath: scoreRealmPath) } self.dispatchGroup.leave() print("toRivalScore Thread End") } print("toRivalScore Strat") } // スコアページHTMLパース func parseScorePerVersion(html: String, isMyself: Bool, iidxId: String , djName: String, versionName: String) -> [Score] { print("parseScorePerVersion Start") var scoreArray: [Score] = [Score]() 〜〜〜 省略 〜〜〜 let score: Score = Score() 〜〜〜 省略(スクレイピングしてscoreモデルに格納しています) 〜〜〜 // scores配列に追加 scoreArray.append(score) } } } print("parseScorePerVersion End") return scoreArray } // Score TBL 保存(ライバル) func saveRivalScore(iidxId: String, scoreArray: [Score], scoreRealm: Realm, scoreRealmPath: String) { print("saveRivalScore Start") try? scoreRealm.write { let now: Date = Date() for score in scoreArray { score.createDate = now score.createUser = Const.Realm.SYSTEM score.updateDate = now score.updateUser = Const.Realm.SYSTEM score.save(scoreRealmPath: scoreRealmPath) } } print("saveRivalScore End") }
その他、お気づきの点ありましたらご指摘いただけると幸いです。
どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/27 04:28
2019/08/29 01:50