Wes McKinney commented on ARROW-317:

This is buffer-level slicing / refcounting -- slicing an Array is more 
complicated because of the null bitmap. There, it's not enough to slice the 
bitmap buffer because you may fall in the middle of a byte. Array slicing will 
need to be implemented via an ArrayView object of sorts that has an offset into 
another array -- another idea is that all arrays could have a value offset in 
memory, so if you did

std::shared_ptr<Array> arr_slice = arr->Slice(5);

Then `arr_slice` would have an offset of 5 into arr's buffers. 

Buffer level slicing is much simpler since it's just bytes

class BufferView : public Buffer {
   std::shared_ptr<Buffer> parent_;
   int64_t offset_;

One option is to make {{Buffer::data}} virtual to address to deal with parent 
mutation issues (so that {{BufferView::data}} returns {{parent_->data() + 

> [C++] Implement zero-copy Slice method on arrow::Buffer that retains 
> reference to parent
> ----------------------------------------------------------------------------------------
>                 Key: ARROW-317
>                 URL: https://issues.apache.org/jira/browse/ARROW-317
>             Project: Apache Arrow
>          Issue Type: New Feature
>          Components: C++
>            Reporter: Wes McKinney
> This will help prevent referenced memory from being garbage-collected while 
> it is referenced by other buffers (for example, in an IPC setting, where we 
> construct Arrow vectors/arrays without copying the input memory).
> Closely related to this: resizeable buffers that are referenced by other 
> buffers should return error status when calling {{Resize}} (if possible). 

This message was sent by Atlassian JIRA

Reply via email to