MariaDb ColumnStore 批量插入
MariaDb ColumnStore BulkInsert
我正在编写一些使用批量插入的代码,看起来像这样:
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。我的问题是让其他人 运行 参与其中,如果是这样,如何避免这种情况。谢谢!
感谢您的 post。您在 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/
我正在编写一些使用批量插入的代码,看起来像这样:
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。我的问题是让其他人 运行 参与其中,如果是这样,如何避免这种情况。谢谢!
感谢您的 post。您在 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/