【问题标题】:MariaDb ColumnStore BulkInsertMariaDb ColumnStore BulkInsert
【发布时间】:2018-07-23 18:45:57
【问题描述】:

我正在编写一些使用批量插入的代码,看起来像这样:

ColumnStoreBulkInsert b = d.createBulkInsert("pst", "events", (short) 0, 0); 
try {
  for (Map<String, Object> record : records) {
    try {
      for (int i = 0; i < schema.length; i++) {
          Object value = record.get(schema[i].toLowerCase());
          String val = value.toString();
          b.setColumn(i, val);
      }
      b.writeRow();
      if (currentBatchSize >= batchSize) {
        b.commit();
        currentBatchSize = 0;
      }
    }
    catch (ColumnStoreException e) {
      b.rollback();
    }
  }
}
catch(Exception e) {
  throw new RuntimeException(e);
}

我遇到的问题是,当我运行它时,内存不足(似乎),因为我必须每次都创建一个新的 ColumnStoreBulkInsert。我的问题是其他人是否遇到过这种情况,如果是这样,如何避免这种情况。谢谢!

【问题讨论】:

  • 什么语言?也许是 Java?
  • 是的,这是 java 8(ColumnStore 版本 mariadb-columnstore-1.1.5-2-centos7.x86_64.bin.tar.gz)
  • 更新:我们清楚地注意到,当我们运行此程序时,我们的内存不断(迅速)攀升。是否需要进行某种发布或某种删除以使其正常工作?我也在使用Oracle的JDK
  • currentBatchSize 在哪里增加?
  • 我在这里省略了该代码,但它已递增。虫子是从下面来的。谢谢大家!

标签: java mariadb bulkinsert columnstore


【解决方案1】:

感谢您的帖子。您在 javamcsapi 的内存管理中遇到了两个尚未修复的错误。这些错误是由于使用 Swig 生成 Java 和我们的基本 C++ API mcsapi 之间的绑定。

第一个错误是,一旦不再需要 Java 包装器 ColumnStoreBulkInsert 对象,Java 中的自动垃圾回收就不会收集 C++ ColumnStoreBulkInsert 对象。它在我们的错误跟踪器 Jira 中记录为 MCOL-1407 [1]。

通常,您可以通过其包装对象的 delete() 方法调用相关 C++ 对象的手动垃圾回收。不幸的是,我们的 javamcsapi 版本 1.1.5 中的 ColumnStoreBulkInsert 也破坏了这一点。我在我们的错误跟踪器 Jira [2] 中将其记录为 MCOL-1588,并且刚刚提交了一个补丁,该补丁将成为我们 1.1.6 版本的一部分。

一旦补丁通过了我们的内部质量保证机制,您就可以从我们的 Github 存储库 [3] 编译 javamcsapi 的开发版本,等待 1.1.6 版本发布,或者从我们的夜间存储库服务器下载 mcsapi 的编译版本 [4 ].

这是一个通过 ColumnStorBulkInsert 的 delete() 方法进行手动垃圾回收的示例。

import com.mariadb.columnstore.api.*;

public class MCSAPITest {

        public static void main(String[] args) {
        ColumnStoreDriver d = new ColumnStoreDriver();
        for(int i=0; i<Integer.MAX_VALUE; i++){
            ColumnStoreBulkInsert b = d.createBulkInsert("test", "garbage_test", (short)0, 0);
            try{
                b.setColumn(0, i);
                b.setColumn(1, Integer.MAX_VALUE-i);
                b.writeRow();
                b.commit();
            } catch(ColumnStoreException e){
                b.rollback();
                e.printStackTrace();
            } finally{
              b.delete(); //<--This is the important part
            }
        }
    }
}

如果您有任何其他问题,请随时回复。

[1]https://jira.mariadb.org/browse/MCOL-1407

[2]https://jira.mariadb.org/browse/MCOL-1588

[3]https://github.com/mariadb-corporation/mariadb-columnstore-api/tree/develop-1.1

[4]http://34.238.186.75/repos/1.1.6-1/nightly/mariadb-columnstore-api/yum/centos/7/x86_64/

【讨论】:

  • 感谢您的反馈!我有几个问题:是否有关于 1.1.6 何时发布的预测,如果有,是否会修复所有这些错误?此外,目前是否有可行的解决方法仍然能够大规模插入?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 2012-04-03
相关资源
最近更新 更多