I've added https://github.com/apache/arrow/issues/36112 to track
deduplication of buffers on write.
I don't think it would require modification of the IPC format.

Ben

On Thu, Jun 15, 2023 at 1:30 PM Matt Topol <zotthewiz...@gmail.com> wrote:

> Based on my understanding, in theory a buffer *could* be shared within a
> batch since the flatbuffers message just uses an offset and length to
> identify the buffers.
>
> That said, I don't believe any current implementation actually does this or
> takes advantage of this in any meaningful way.
>
> --Matt
>
> On Thu, Jun 15, 2023 at 1:00 PM Will Jones <will.jones...@gmail.com>
> wrote:
>
> > Hi Ben,
> >
> > It's exciting to see this move along.
> >
> > The buffers will be duplicated. If buffer duplication is becomes a
> concern,
> > > I'd prefer to handle
> > > that in the ipc writer. Then buffers which are duplicated could be
> > detected
> > > by checking
> > > pointer identity and written only once.
> >
> >
> > Question: to be able to write buffer only once and reference in multiple
> > arrays, does that require a change to the IPC format? Or is sharing
> buffers
> > within the same batch already allowed in the IPC format?
> >
> > Best,
> >
> > Will Jones
> >
> > On Thu, Jun 15, 2023 at 9:03 AM Benjamin Kietzman <bengil...@gmail.com>
> > wrote:
> >
> > > Hello again all,
> > >
> > > The PR [1] to add string view to the format and the C++ implementation
> is
> > > hovering around passing CI and has been undrafted. Furthermore, there
> is
> > > now also a PR [2] to add string view to the Go implementation. Code
> > review
> > > is underway for each PR and I'd like to move toward a vote for
> > acceptance-
> > > are there any other preliminaries which I've neglected?
> > >
> > > To reiterate the answers to some past questions:
> > > - Benchmarks are added in the C++ PR [1] to demonstrate the performance
> > of
> > >   conversion between the various string formats. In addition, there are
> > >   some benchmarks which demonstrate the performance gains available
> with
> > >   the new format [3].
> > > - Adding string view to the C ABI is a natural follow up, but should be
> > >   handled independently. An issue has been added to track that
> > >   enhancement [4].
> > >
> > > Sincerely,
> > > Ben Kietzman
> > >
> > > [1] https://github.com/apache/arrow/pull/35628
> > > [2] https://github.com/apache/arrow/pull/35769
> > > [3] https://github.com/apache/arrow/pull/35628#issuecomment-1583218617
> > > [4] https://github.com/apache/arrow/issues/36099
> > >
> > > On Wed, May 17, 2023 at 12:53 PM Benjamin Kietzman <
> bengil...@gmail.com>
> > > wrote:
> > >
> > > > @Jacob
> > > > > You mention benchmarks multiple times, are these results published
> > > > somewhere?
> > > >
> > > > I benchmarked the performance of raw pointer vs index offset views in
> > my
> > > > PR to velox,
> > > > I do intend to port them to my arrow PR but I haven't gotten there
> yet.
> > > > Furthermore, it
> > > > seemed less urgent to me since coexistence of the two types in the
> c++
> > > > implementation
> > > > defers the question of how aggressively one should be preferred over
> > the
> > > > other.
> > > >
> > > > @Dewey
> > > > > I don't see the C Data interface in the PR
> > > >
> > > > I have not addressed the C ABI in this PR. As you mention, it may be
> > > > useful to transmit
> > > > arrays with raw pointer views between implementations which allow
> > them. I
> > > > can address
> > > > this in a follow up PR.
> > > >
> > > > @Will
> > > > > If I understand correctly, multiple arrays can reference the same
> > > buffers
> > > > > in memory, but once they are written to IPC their data buffers will
> > be
> > > > > duplicated. Is that right?
> > > > The buffers will be duplicated. If buffer duplication is becomes a
> > > > concern, I'd prefer to handle
> > > > that in the ipc writer. Then buffers which are duplicated could be
> > > > detected by checking
> > > > pointer identity and written only once.
> > > >
> > > >
> > > > On Wed, May 17, 2023 at 12:07 AM Will Jones <will.jones...@gmail.com
> >
> > > > wrote:
> > > >
> > > >> Hello Ben,
> > > >>
> > > >> Thanks for your work on this. I think this will be an excellent
> > addition
> > > >> to
> > > >> the format.
> > > >>
> > > >> If I understand correctly, multiple arrays can reference the same
> > > buffers
> > > >> in memory, but once they are written to IPC their data buffers will
> be
> > > >> duplicated. Is that right?
> > > >>
> > > >> Dictionary types have a special message so they can be reused across
> > > >> batches and even fields. Did we consider adding a similar message
> for
> > > >> string view buffers?
> > > >>
> > > >> One relevant use case I'm curious about is substring extraction. For
> > > >> example, if I have a column of URIs and I create columns where I've
> > > >> extracted substrings like the hostname, path, and a list column of
> > query
> > > >> parameters, I'd like for those latter columns to be views into the
> URI
> > > >> buffers, rather than full copies.
> > > >>
> > > >> However, I've never touched the IPC read code paths, so it's quite
> > > >> possible
> > > >> I'm overlooking something obvious.
> > > >>
> > > >> Best,
> > > >>
> > > >> Will Jones
> > > >>
> > > >>
> > > >> On Tue, May 16, 2023 at 6:29 PM Dewey Dunnington
> > > >> <de...@voltrondata.com.invalid> wrote:
> > > >>
> > > >> > Very cool!
> > > >> >
> > > >> > In addition to performance mentioned above, I could see this being
> > > >> > useful for the R bindings - we already have a global string pool
> > and a
> > > >> > mechanism for keeping a vector of them alive.
> > > >> >
> > > >> > I don't see the C Data interface in the PR although I may have
> > missed
> > > >> > it - is that a part of the proposal? It seems like it would be
> > > >> > possible to use raw pointers as long as they can be guaranteed to
> be
> > > >> > valid until the release callback is called?
> > > >> >
> > > >> > On Tue, May 16, 2023 at 8:43 PM Jacob Wujciak
> > > >> > <ja...@voltrondata.com.invalid> wrote:
> > > >> > >
> > > >> > > Hello Everyone,
> > > >> > > I think keeping interoperability with the large ecosystem is a
> > very
> > > >> > > important goal for arrow so I am overall in favor of this
> > proposal!
> > > >> > >
> > > >> > > You mention benchmarks multiple times, are these results
> published
> > > >> > > somewhere?
> > > >> > >
> > > >> > > Thanks
> > > >> > >
> > > >> > > On Tue, May 16, 2023 at 11:39 PM Benjamin Kietzman <
> > > >> bengil...@gmail.com>
> > > >> > > wrote:
> > > >> > >
> > > >> > > > Hello all,
> > > >> > > >
> > > >> > > > As previously discussed on this list [1], an
> > UmbraDB/DuckDB/Velox
> > > >> > > > compatible
> > > >> > > > "string view" type could bring several performance benefits to
> > > >> access
> > > >> > and
> > > >> > > > authoring of string data in the arrow format [2]. Additionally
> > > >> better
> > > >> > > > interoperability with engines already using this format could
> be
> > > >> > > > established.
> > > >> > > >
> > > >> > > > PR #0 [3] adds Utf8View and BinaryView types to the C++
> > > >> implementation
> > > >> > and
> > > >> > > > to
> > > >> > > > the IPC format. For the purposes of IPC raw pointers are not
> > used.
> > > >> > Instead,
> > > >> > > > each view contains a pair of 32 bit unsigned integers which
> > encode
> > > >> the
> > > >> > > > index of
> > > >> > > > a character buffer (string view arrays may consist of a
> variable
> > > >> > number of
> > > >> > > > such buffers) and the offset of a view's data within that
> buffer
> > > >> > > > respectively.
> > > >> > > > Benefits of this substitution include:
> > > >> > > > - This makes explicit the guarantee that lifetime of all
> > character
> > > >> > data is
> > > >> > > > equal
> > > >> > > >   to that of the array which views it, which is critical for
> > > >> confident
> > > >> > > >   consumption across an interface boundary.
> > > >> > > > - As with other types in the arrow format, such arrays are
> > > >> > serializable and
> > > >> > > >   venue agnostic; directly usable in shared memory without
> > > >> > modification.
> > > >> > > > - Indices and offsets are easily validated.
> > > >> > > >
> > > >> > > > Accessing the data requires some trivial pointer arithmetic,
> but
> > > in
> > > >> > > > benchmarking
> > > >> > > > this had negligible impact on sequential access and only minor
> > > >> impact
> > > >> > on
> > > >> > > > random
> > > >> > > > access.
> > > >> > > >
> > > >> > > > In the C++ implementation, raw pointer string views are
> > supported
> > > >> as an
> > > >> > > > extended
> > > >> > > > case of the Utf8View type:
> > `utf8_view(/*has_raw_pointers=*/true)`.
> > > >> > > > Branching on
> > > >> > > > this access pattern bit at the data type level has negligible
> > > >> impact on
> > > >> > > > performance since the branch resides outside any hot loops.
> > > Utility
> > > >> > > > functions
> > > >> > > > are provided for efficient (potentially in-place) conversion
> > > between
> > > >> > raw
> > > >> > > > pointer
> > > >> > > > and index offset views. For example, the C++ implementation
> > could
> > > >> zero
> > > >> > copy
> > > >> > > > a raw pointer array from Velox, filter it, then convert to
> > > >> > index/offset for
> > > >> > > > serialization. Other implementations may choose to accommodate
> > or
> > > >> > eschew
> > > >> > > > raw
> > > >> > > > pointer views as their communities direct.
> > > >> > > >
> > > >> > > > Where desirous in a rigorously controlled context this still
> > > enables
> > > >> > > > construction
> > > >> > > > and safe consumption of string view arrays which reference
> > memory
> > > >> not
> > > >> > > > directly bound to the lifetime of the array. I'm not sure when
> > or
> > > >> if we
> > > >> > > > would
> > > >> > > > find it useful to have arrays like this; I do not introduce
> any
> > in
> > > >> > [3]. I
> > > >> > > > mention
> > > >> > > > this possibility to highlight that if benchmarking
> demonstrates
> > > that
> > > >> > such
> > > >> > > > an
> > > >> > > > approach brings a significant performance benefit to some
> > > operation,
> > > >> > the
> > > >> > > > only
> > > >> > > > barrier to its adoption would be code review. Likewise if more
> > > >> > intensive
> > > >> > > > benchmarking determines that raw pointer views critically
> > > outperform
> > > >> > > > index/offset
> > > >> > > > views for real-world analytics tasks, prioritizing raw pointer
> > > >> string
> > > >> > views
> > > >> > > > for usage within the C++ implementation will be
> straightforward.
> > > >> > > >
> > > >> > > > See also the proposal to Velox that their string view vector
> be
> > > >> > refactored
> > > >> > > > in a similar vein [4].
> > > >> > > >
> > > >> > > > Sincerely,
> > > >> > > > Ben Kietzman
> > > >> > > >
> > > >> > > > [1]
> > > >> https://lists.apache.org/thread/49qzofswg1r5z7zh39pjvd1m2ggz2kdq
> > > >> > > > [2] http://cidrdb.org/cidr2020/papers/p29-neumann-cidr20.pdf
> > > >> > > > [3] https://github.com/apache/arrow/pull/35628
> > > >> > > > [4]
> https://github.com/facebookincubator/velox/discussions/4362
> > > >> > > >
> > > >> >
> > > >>
> > > >
> > >
> >
>

Reply via email to