0

我正在研究数组构建器 UnsafeAppend api。根据文档中的代码。

arrow::Int64Builder builder;
// Make place for 8 values in total
builder.Resize(8);
builder.UnsafeAppend(1);
builder.UnsafeAppend(2);
builder.UnsafeAppend(3);
builder.UnsafeAppendNull();
builder.UnsafeAppend(5);
builder.UnsafeAppend(6);
builder.UnsafeAppend(7);
builder.UnsafeAppend(8);

std::shared_ptr<arrow::Array> array;
arrow::Status st = builder.Finish(&array);

Builder.Resize(i) 应该为 i 值腾出空间。将 i 更改为另一个值(例如 100000000)后,我应该有 100000000 个值的空间。我的编译器出现了分段错误,这很奇怪。我做了另一个实验,将构建器的大小调整为 10。构建器应该只有 10 个空间,但是我的代码可以成功地将比 10 更多的值附加到构建器。

我有点困惑,构建器不应该具有与 api Resize(i) 完全相同的空间 i。有谁知道 UnsafeAppend API 的任何正确方法?

int row = 100000000
arrow::StringBuilder b1;
b1.Resize(row);
for(int i=0;i<row;i++)
{
   std::string str = "test";
   b1.UnsafeAppend(str);
}

4

1 回答 1

0

Resize(n)n条目保留空间,但不为字符数据保留空间(这是 所要求的arrow::StringBuilder::UnsafeAppend)。对于您的示例,我建议:

int row = 100000000
arrow::StringBuilder b1;

b1.Resize(row);

std::string str = "test";
b1.ReserveData(row * str.size());

for(int i=0;i<row;i++)
{
   b1.UnsafeAppend(str);
}
于 2020-06-08T21:47:16.690 回答