从 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.h
和 gdk.h
)。重要的部分是:
-
使用
COLnew
以正确的类型和计数创建 BAT
为它们添加一些值,例如通过指针访问(具有正确的类型长度)bat->theap.base[i]
为追加设置 BAT 属性(BATsetcount
、BATsettrivprop
和 BBPkeepref
)
分配和填充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的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中的 MonetDBLite 中使用 WHERE 子句的问题
在 MonetDBLite 中使用“INSERT INTO test VALUES”加载巨大的表