我正在编写一些代码,它使用批量插入,如下所示:
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。我的问题是让其他人遇到这种情况,如果是的话,这是如何避免的。谢谢!
发布于 2018-07-24 20:36:29
谢谢你的帖子。您在javamcsapi的内存管理中碰到了两个尚未修复的bug。这些bug是由于使用Swig来生成C++与我们的基础之间的绑定而产生的。
第一个bug是,一旦不再需要C++包装器ColumnStoreBulkInsert对象,Java中的自动垃圾收集就不会收集ColumnStoreBulkInsert对象。它被记录为MCOL-14071在我们的bug跟踪器Jira中。
通常,您可以通过包装器对象的delete()方法调用有关C++对象的手动垃圾收集。不幸的是,在我们的javamcsapi的1.1.5版本中,ColumnStoreBulkInsert也破坏了这一点。我在我们的bug跟踪器Jira 2中将其记录为MCOL-1588,并提交了一个补丁,它将成为我们1.1.6版本的一部分。
一旦该修补程序通过了我们的内部质量保证机制,您就可以从我们的Github存储库3编译javamcsapi的开发构建,等待1.1.6发行版,或者从我们的夜间存储库服务器4下载已编译的mcsapi版本。
下面是通过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
}
}
}
}如果您还有任何问题,请不要犹豫地回答。
4
https://stackoverflow.com/questions/51485381
复制相似问题