首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用来自monetdb_append的MonetdbLite C API

使用来自monetdb_append的MonetdbLite C API
EN

Stack Overflow用户
提问于 2018-09-08 14:54:04
回答 1查看 201关注 0票数 0

我试图在应用程序中使用MonetDBLite C。根据PDF (https://arxiv.org/pdf/1805.08520.pdf),我将受益于使用monetdb_append函数加载大量数据的速度提高。PDF格式:

除了发出SQL查询外,嵌入式进程还可以使用monetdb_append函数有效地将大量数据追加到数据库中。此函数接受要追加的表的架构和名称,以及对要追加到表的列的数据的引用。此函数允许高效的批量插入,因为在将单个INSERT解析为语句时需要大量开销,这将成为用户希望插入大量数据时的瓶颈。

这是embedded.h中的声明

代码语言:javascript
复制
char* monetdb_append(monetdb_connection conn, const char* schema, const char* table, append_data *data, int ncols);

有谁举过如何使用这个函数的例子吗?我假设batid of append_data结构是对BAT结构的识别。但目前还不清楚如何将其与现有的API一起使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-10 09:18:40

二进制追加实际上需要构造尽可能多的BAT结构,因为您需要附加列。需要包括一些额外的MonetDBLite头(monetdb_config.hgdk.h)。重要的部分是:

  1. 使用具有正确类型和计数的COLnew创建蝙蝠
  2. 向它们添加一些值,例如通过指针访问(类型长度正确的)到bat->theap.base[i]
  3. 设置追加的BAT属性(BATsetcountBATsettrivpropBBPkeepref)
  4. 分配和填充append_data数据结构。
  5. 打给monetdb_append

下面是一个简短的示例,说明如何将42个值附加到包含整数的单列表(CREATE TABLE test (my_column INTEGER);)中。

代码语言:javascript
复制
// startup, connect etc. before

size_t n = 42;
BAT* b = COLnew(0, TYPE_int, n, TRANSIENT);
for (size_t i = 0; i < n; i++) {
    ((int*)b->theap.base)[i] = i; // or whatever
}

BATsetcount(b, n);
BATsettrivprop(b);
BBPkeepref(b->batCacheid);

append_data *ad = NULL;
ad = malloc(1 * sizeof(append_data));
ad[0].colname = "my_column";
ad[0].batid = b->batCacheid;

if (monetdb_append(conn, "sys", "test", ad, 1) != NULL) { /* handle error */}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52236453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档