Cool. Thanks for doing that!

On Thu, Jun 15, 2023 at 12:40 Benjamin Kietzman <bengil...@gmail.com> wrote:

> 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