由于SQLite的db文件损坏问题,我们最近计划在macOS和iOS应用程序中从SQLite切换到Realm,因此我们首先使用macOS app。所有编码更改都很顺利,应用程序启动正常。
关于应用程序和数据库使用的背景 - 应用程序确实非常频繁地使用数据库,并且每分钟对数据库执行过多的读写操作,并为其保存大量的xml。在每一分钟内,它使用xml写入/更新大约10-12条记录(最大值)并读取25-30条记录。每次读取后,它会从数据库中删除数据和xml,我的期望是一旦数据被删除,它应该释放空间并减小文件大小,但看起来它正在不断增长。
To test the new DB changes we kept app running app 3-4 days and DB file size went to 64.42GB and app started being slow. Please refer the attached screen shot.
为了进一步调试,我使用新的DB文件启动应用程序,大小为4KB,但在5分钟内它变为295KB,并且从未减小尺寸,甚至连续添加和删除记录。
为了进一步说明,app使用NSThreads
执行各种操作,并且这些线程将数据写入和读取到DB,但具有正确的begin\commit
事务。我还阅读了大文件大小'在https://realm.io/docs/java/latest/#faq并试图找到compactRealm
,但无法在目标c中找到它。
任何人都可以提供建议。
更新 - 我放弃了领域
经过15天的努力,最后我已经停止使用Realm并开始使用SQLite修复/解决db文件损坏问题。通过更改线程代码修复了Realm Huge DB文件问题但是在运行应用程序7-8小时后我开始收到Too many open files
错误。
整整一周调试并做了所有可能的更改,在某些时候看起来好像因为xcode没有显示任何打开的文件。但我再次开始Too many open files
崩溃,然后使用仪器进行调试,发现有很多打开文件到realm数据库,锁定,提交和cv文件。
我确信app中没有泄漏,xcode也不会在Disk usage
中显示那些打开的文件。我决定在Realm调用之前和之后在代码中调用lsof命令,并且大多数它不会增加打开文件数,但有时它会增加。在我的应用程序中,它在大约6小时内从120个文件开始到550个。 Xcode通过Disk usage
看起来很好,但是仪器显示打开的文件。
没有来自Realm团队的良好支持,向他们发送了电子邮件,只得到了一个回复。根据他们的建议对代码进行了许多更改,并且根本没有工作,所以放弃了它。我认为它仅适用于小型应用程序。