150k字文本文件是0.8mb,其中领域db大小是18mb

时间:2018-02-14 08:39:04

标签: android realm

我在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);
}

2 个答案:

答案 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创建许多需要的中间版本   被跟踪。避免这种情况有点棘手,但可以   通常可以通过批量写入或避免来完成   打开领域,否则阻止后台主题。