从 MonetdbLite C API 使用 monetdb_append

Posted

技术标签:

【中文标题】从 MonetdbLite C API 使用 monetdb_append【英文标题】:Using monetdb_append from MonetdbLite C API 【发布时间】:2018-09-08 14:54:04 【问题描述】:

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

除了发出 SQL 查询,嵌入式进程还可以 使用有效地将大量数据批量追加到数据库中 monetdb_append 函数。该函数采用模式和 要附加到的表的名称,以及对要附加到的数据的引用 表的列。此功能允许高效批量 插入,因为解析中涉及大量开销 单独的 INSERT INTO 语句,当 用户要插入大量数据。

这是embedded.h中的声明

char* monetdb_append(monetdb_connection conn, const char* schema, const char* table, append_data *data, int ncols);

有没有人举例说明如何使用这个功能?我假设append_data结构的batid是BAT结构的标识。但目前尚不清楚如何将其与现有 API 一起使用。

【问题讨论】:

【参考方案1】:

二进制追加确实需要构建与要追加的列一样多的 BAT 结构。需要包含一些额外的 MonetDBLite 标头(monetdb_config.hgdk.h)。重要的部分是:

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

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

// 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 */

【讨论】:

看起来很清楚。对于字符串类型 ((char *)b->theap.base)[i] = (char *)mydata;足够?对于没有直接转换为对应 C 类型的日期、时间、时间戳类型,是否还有其他提示? 您可以将 BATappend 用于非本地类型

以上是关于从 MonetdbLite C API 使用 monetdb_append的主要内容,如果未能解决你的问题,请参考以下文章

使用 tbl 和 src_monetdblite 访问数据

在 R 中的 MonetDBLite 中使用 WHERE 子句的问题

在 MonetDBLite 中使用“INSERT INTO test VALUES”加载巨大的表

将变量添加到 MonetDBLite 中的表

SQL 将许多 tsv 文件连接到数据库中的单个表中,同时跟踪文件源 (MonetDBLite)

monetdblite:是不是可以配置“monetdb_query”来运行多个语句?