我在realm db中插入150000个对象。 Object只有一个属性是string。 与此同时,我正在为每个字符串创建一个带有换行符的字符串构建器 最后将其写入文本文件。
最后文本文件大小为0.8mb。领域db大小为18mb。它的原因是什么。如何最小化领域db大小。你能告诉我吗?这是领域插入代码
private void insertWord() {
long time = System.currentTimeMillis();
StringBuilder builder=new StringBuilder();
RealmConf conf = RealmConf.getInstance(true);
int i = 0;
RealmUtils.startTransaction(conf);
while (i < 150000) {
i++;
String word = "Word:" + i;
EB eb = new EB(word);
builder.append(word+"\n");
RealmUtils.saveWord(eb, conf);
Log.i("word check" + i++, "seelog:" + word);
}
RealmUtils.commitTransaction(conf);
writeStringIntoFile(builder.toString(),0);
}
答案 0 :(得分:1)
对于科学,您可以尝试以下方法:
private void insertWord() {
long time = System.currentTimeMillis();
StringBuilder builder=new StringBuilder();
RealmConf conf = RealmConf.getInstance(true);
int i = 0;
int batchCount = 0;
while (i < 150000) {
if(batchCount == 0) {
RealmUtils.startTransaction(conf);
}
batchCount++
i++;
String word = "Word:" + i;
EB eb = new EB(word);
builder.append(word+"\n");
RealmUtils.saveWord(eb, conf);
Log.i("word check" + i++, "seelog:" + word);
if(batchCount == 3000) {
RealmUtils.commitTransaction(conf);
batchCount = 0;
}
}
if(batchCount != 0) {
RealmUtils.commitTransaction(conf);
}
writeStringIntoFile(builder.toString(),0);
}
答案 1 :(得分:0)
可能是因为您忘记致电Realm.close()
。
有关详细信息,请参阅此文档。
https://realm.io/docs/java/latest/#faq
大域文件大小您应该期望Realm数据库占用更少 磁盘空间比等效的SQLite数据库,但为了给 如果您对数据有一致的看法,那么Realm可以在多个方面运行 领域的版本。这可能会导致Realm文件增长 如果最老和最新之间的差异不成比例 数据版本变得太大了。
Realm会自动删除旧版本的数据 不再使用,但实际文件大小不会减少。 额外的空间将在未来的写作中重复使用。
如果需要,可以通过压缩Realm来移除额外的空间 文件。这可以手动完成,也可以在打开时自动完成 领域第一次。
如果您遇到意外的文件大小增长,则通常是这样 发生的原因有两个:
1)你在后台线程上打开一个领域而忘记关闭它 试。
这将导致Realm保留对数据的引用 后台线程并且是Realm文件大小的最常见原因 的问题。解决方案是确保正确关闭您的领域 实例。在这里和这里阅读更多。领域会检测你是否忘了 正确关闭Realm实例并在Logcat中打印警告。 带有loopers的线程,比如UI线程,没有这个问题。
2)你从Realm读取一些数据,然后在a上阻塞线程 长时间运行,同时多次写入Realm 线程。
这将导致Realm创建许多需要的中间版本 被跟踪。避免这种情况有点棘手,但可以 通常可以通过批量写入或避免来完成 打开领域,否则阻止后台主题。