Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Realm objective c-非常大的数据库文件大小-64GB_Objective C_Sqlite_Realm - Fatal编程技术网

Objective c Realm objective c-非常大的数据库文件大小-64GB

Objective c Realm objective c-非常大的数据库文件大小-64GB,objective-c,sqlite,realm,Objective C,Sqlite,Realm,由于SQLite存在数据库文件损坏问题,我们最近计划在macOS和iOS应用程序中从SQLite切换到Realm,所以我们首先从macOS应用程序开始。所有的编码更改都很顺利,应用程序开始正常工作 关于应用程序和数据库使用的背景-应用程序确实非常频繁地使用数据库,每分钟对数据库执行太多的读写操作,并将大的xml保存到数据库中。它每分钟用xml写入/更新大约10-12条记录(最多),并读取25-30条记录。每次读取后,它都会从数据库中删除数据和xml,我的期望是,一旦数据被删除,它将释放空间并减少

由于SQLite存在数据库文件损坏问题,我们最近计划在macOS和iOS应用程序中从SQLite切换到Realm,所以我们首先从macOS应用程序开始。所有的编码更改都很顺利,应用程序开始正常工作

关于应用程序和数据库使用的背景-应用程序确实非常频繁地使用数据库,每分钟对数据库执行太多的读写操作,并将大的xml保存到数据库中。它每分钟用xml写入/更新大约10-12条记录(最多),并读取25-30条记录。每次读取后,它都会从数据库中删除数据和xml,我的期望是,一旦数据被删除,它将释放空间并减少文件大小,但看起来它正在不断增长

为了测试新的数据库更改,我们让应用程序运行了3-4天,数据库文件大小变为64.42GB,应用程序开始变慢。请参阅随附的屏幕截图。

为了进一步调试,我用新的DB文件启动了这个应用程序,文件大小为4KB,但在5分钟内,文件大小变为295KB,而且从未缩小过,甚至记录不断地被添加和删除

为了进一步澄清,应用程序使用
NSThreads
执行各种操作,这些线程通过适当的
begin\commit
事务向数据库写入和读取数据。我还在的“大文件大小”中阅读,并试图查找
compactRealm
,但在objective c中找不到它

谁能给我建议一下吗

更新-我放弃领域

经过15天的努力,我终于停止了Realm的使用,并开始用SQLite修复/解决db文件损坏问题。通过更改线程的代码,解决了Realm巨大的DB文件问题,但在运行应用程序7-8小时后,我开始发现
打开的文件太多
错误

调试了整整一周,做了所有可能的更改,在某个时候看起来一切都很好,因为xcode没有显示任何打开的文件。但我再次开始得到太多打开的文件,然后用仪器调试,发现有太多打开的文件到领域数据库、锁、提交和cv文件

我确信应用程序中没有漏洞,xcode也不会在
磁盘使用情况中显示这些打开的文件。我决定在领域调用之前和之后在代码中调用lsof命令,其中大部分并没有增加打开的文件数,但有时会增加打开的文件数。在我的应用程序中,它在大约6小时内从120个文件变成550个文件。通过
磁盘使用情况来看,Xcode看起来一切正常,但仪器显示打开的文件


Realm团队没有很好的支持,向他们发送了电子邮件,只得到了一个回复。按照他们的建议对代码做了很多修改,但根本不起作用,所以放弃了。我认为它只适用于小型应用程序。

由于大量数据尚未写入,数据库正在增长。数据库正在保存对旧版本数据的引用。这一点已经解释过了,在“中间版本的文件大小和跟踪”的领域文档中有一些关于这个主题的建议:我已经阅读了所有这些内容,但实际上找不到任何方法来跟踪问题的实际原因。我的理解是,在重新启动应用程序时,它应该自动释放所有未使用的空间,并将DB恢复为实际大小。我如何跟踪问题的确切位置?另外,它提到
为了避免这个问题,您可以调用invalidate来告诉Realm您不再需要迄今为止从Realm中读取的任何对象,这使我们不必跟踪这些对象的中间版本。该领域将在下次访问时更新为最新版本。
那么在哪里调用invalidate?我理解。跟踪这些问题对任何人来说都不容易。我过去曾尝试过,但没有完全成功。在RLMRealm类上调用的方法是
-invalidate
。您的问题中没有足够的信息来确定导致您看到的行为的原因。我建议通过电子邮件联系help@realm.io或者,Realm的人可以直接帮助你,以一种更有利于来回讨论的方式。嗨,Mahesh,来自Realm的JP。我很抱歉看到那个王国给你带来这么多麻烦。我们的记录显示,我们的两名工程师在发布后24小时内与您联系,并试图从您那里获得更多信息,以帮助优化您对Realm的使用,避免保留旧的Realm版本(使该时间点的数据保持有效)。几天后,我们再次向您发送电子邮件,鼓励您更新到2.4.2并报告更多信息。我们还没有收到你的回音。我已经跟踪了那个电子邮件线程,以防您仍然想解决这个问题。由于大量数据尚未写入,数据库正在增长。数据库正在保存对旧版本数据的引用。这一点已经解释过了,在“中间版本的文件大小和跟踪”的领域文档中有一些关于这个主题的建议:我已经阅读了所有这些内容,但实际上找不到任何方法来跟踪问题的实际原因。我的理解是,在重新启动应用程序时,它应该自动释放所有未使用的空间,并将DB恢复为实际大小。我如何跟踪问题的确切位置?另外,它提到
为了避免这个问题,您可以调用invalidate来告诉Realm您不再需要迄今为止从Realm中读取的任何对象,这使我们不必跟踪这些对象的中间版本。该领域将在下次访问时更新为最新版本。
那么在哪里调用invalidate?我理解。跟踪这些问题对任何人来说都不容易。我过去曾尝试过,但没有完全成功。在RLMRealm类上调用的方法是
-invalidate
。您的问题中没有足够的信息来确定导致您看到的行为的原因。我建议通过电子邮件联系help@realm.io或者让Realm的人来帮忙