Вопрос: Конструктор массивов Apache Arrow UnsafeAppend

Я работаю над создателем массивов 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.

Я немного сбит с толку, разве у конструктора должно быть именно то пространство i с api Resize (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);
}


person user147852369    schedule 17.05.2020    source источник


Ответы (1)


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);
}
person Kietz    schedule 08.06.2020