使用来自 MonetdbLite C API 的 monetdb_append
Using monetdb_append from MonetdbLite C API
我正在尝试在应用程序中使用 MonetDBLite C。根据 PDF (https://arxiv.org/pdf/1805.08520.pdf),我会受益于使用 monetdb_append 函数加载大量数据的速度提升。来自 PDF:
In addition to issuing SQL queries, the embedded process can
efficiently bulk append large amounts of data to the database using
the monetdb_append function. This function takes the schema and the
name of a table to append to, and a reference to the data to append to
the columns of the table. This function allows for efficient bulk
insertions, as there is significant overhead involved in parsing
individual INSERT INTO statements, which becomes a bottleneck when the
user wants to insert a large amount of data.
这是embedded.h
中的声明
char* monetdb_append(monetdb_connection conn, const char* schema, const char* table, append_data *data, int ncols);
有没有人举例说明如何使用此功能?我假设append_data结构的batid是一个BAT结构的标识。但不清楚如何将其与现有 API.
一起使用
二进制附加确实需要构建与要附加的列一样多的 BAT 结构。需要包含一些额外的 MonetDBLite headers(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);
)
的 one-column table
// 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 */}
我正在尝试在应用程序中使用 MonetDBLite C。根据 PDF (https://arxiv.org/pdf/1805.08520.pdf),我会受益于使用 monetdb_append 函数加载大量数据的速度提升。来自 PDF:
In addition to issuing SQL queries, the embedded process can efficiently bulk append large amounts of data to the database using the monetdb_append function. This function takes the schema and the name of a table to append to, and a reference to the data to append to the columns of the table. This function allows for efficient bulk insertions, as there is significant overhead involved in parsing individual INSERT INTO statements, which becomes a bottleneck when the user wants to insert a large amount of data.
这是embedded.h
中的声明char* monetdb_append(monetdb_connection conn, const char* schema, const char* table, append_data *data, int ncols);
有没有人举例说明如何使用此功能?我假设append_data结构的batid是一个BAT结构的标识。但不清楚如何将其与现有 API.
一起使用二进制附加确实需要构建与要附加的列一样多的 BAT 结构。需要包含一些额外的 MonetDBLite headers(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 */}