The read times are still with memory mapping for the uncompressed case?
 If so, impressive!

Regards

Antoine.


Le 01/04/2020 à 16:44, Wes McKinney a écrit :
> Several pieces of work got done in the last few days:
> 
> * Changing from LZ4 raw to LZ4 frame format (what is recommended for
> interoperability)
> * Parallelizing both compression and decompression at the field level
> 
> Here are the results (using 8 threads on an 8-core laptop). I disabled
> the "memory map" feature so that in the uncompressed case all of the
> data must be read off disk into memory. This helps illustrate the
> compression/IO tradeoff to wall clock load times
> 
> File size (only LZ4 may be different): https://ibb.co/CP3VQkp
> Read time: https://ibb.co/vz9JZMx
> Write time: https://ibb.co/H7bb68T
> 
> In summary, now with multicore compression and decompression,
> LZ4-compressed files are faster both to read and write even on a very
> fast SSD, as are ZSTD-compressed files with a low ZSTD compression
> level. I didn't notice a major difference between LZ4 raw and LZ4
> frame formats. The reads and writes could be made faster still by
> pipelining / making concurrent the disk read/write and
> compression/decompression steps -- the current implementation performs
> these tasks serially. We can improve this in the near future
> 
> I'll update the Format proposal this week so we can move toward
> something we can vote on. I would recommend that we await
> implementations and integration tests for this before releasing this
> as stable, in line with prior discussions about adding stuff to the
> IPC protocol
> 
> On Thu, Mar 26, 2020 at 4:57 PM Wes McKinney <wesmck...@gmail.com> wrote:
>>
>> Here are the results:
>>
>> File size: https://ibb.co/71sBsg3
>> Read time: https://ibb.co/4ZncdF8
>> Write time: https://ibb.co/xhNkRS2
>>
>> Code: 
>> https://github.com/wesm/notebooks/blob/master/20190919file_benchmarks/FeatherCompression.ipynb
>> (based on https://github.com/apache/arrow/pull/6694)
>>
>> High level summary:
>>
>> * Chunksize 1024 vs 64K has relatively limited impact on file sizes
>>
>> * Wall clock read time is impacted by chunksize, maybe 30-40%
>> difference between 1K row chunks versus 16K row chunks. One notable
>> thing is that you can see clearly the overhead associated with IPC
>> reconstruction even when the data is memory mapped. For example, in
>> the Fannie Mae dataset there are 21,661 batches (each batch has 31
>> fields) when the chunksize is 1024. So a read time of 1.3 seconds
>> indicates ~60 microseconds of overhead for each record batch. When you
>> consider the amount of business logic involved with reconstructing a
>> record batch, 60 microseconds is pretty good. This also shows that
>> every microsecond counts and we need to be carefully tracking
>> microperformance in this critical operation.
>>
>> * Small chunksize results in higher write times for "expensive" codecs
>> like ZSTD with a high compression ratio. For "cheap" codecs like LZ4
>> it doesn't make as much of a difference
>>
>> * Note that LZ4 compressor results in faster wall clock time to disk
>> presumably because the compression speed is faster than my SSD's write
>> speed
>>
>> Implementation notes:
>> * There is no parallelization or pipelining of reads or writes. For
>> example, on write, all of the buffers are compressed with a single
>> thread and then compression stops until the write to disk completes.
>> On read, buffers are decompressed serially
>>
>>
>> On Thu, Mar 26, 2020 at 12:24 PM Wes McKinney <wesmck...@gmail.com> wrote:
>>>
>>> I'll run a grid of batch sizes (from 1024 to 64K or 128K) and let you
>>> know the read/write times and compression ratios. Shouldn't take too
>>> long
>>>
>>> On Wed, Mar 25, 2020 at 10:37 PM Fan Liya <liya.fa...@gmail.com> wrote:
>>>>
>>>> Thanks a lot for sharing the good results.
>>>>
>>>> As investigated by Wes, we have existing zstd library for Java (zstd-jni) 
>>>> [1], and lz4 library for Java (lz4-java) [2].
>>>> +1 for the 1024 batch size, as it represents an important scenario where 
>>>> the batch fits into the L1 cache (IMO).
>>>>
>>>> Best,
>>>> Liya Fan
>>>>
>>>> [1] https://github.com/luben/zstd-jni
>>>> [2] https://github.com/lz4/lz4-java
>>>>
>>>> On Thu, Mar 26, 2020 at 2:38 AM Micah Kornfield <emkornfi...@gmail.com> 
>>>> wrote:
>>>>>
>>>>> If it isn't hard could you run with batch sizes of 1024 or 2048 records?  
>>>>> I
>>>>> think there was a question previously raised if there was benefit for
>>>>> smaller sizes buffers.
>>>>>
>>>>> Thanks,
>>>>> Micah
>>>>>
>>>>>
>>>>> On Wed, Mar 25, 2020 at 8:59 AM Wes McKinney <wesmck...@gmail.com> wrote:
>>>>>
>>>>>> On Tue, Mar 24, 2020 at 9:22 PM Micah Kornfield <emkornfi...@gmail.com>
>>>>>> wrote:
>>>>>>>
>>>>>>>>
>>>>>>>> Compression ratios ranging from ~50% with LZ4 and ~75% with ZSTD on
>>>>>>>> the Taxi dataset to ~87% with LZ4 and ~90% with ZSTD on the Fannie Mae
>>>>>>>> dataset. So that's a huge space savings
>>>>>>>
>>>>>>> One more question on this.  What was the average row-batch size used?  I
>>>>>>> see in the proposal some buffers might not be compressed, did you this
>>>>>>> feature in the test?
>>>>>>
>>>>>> I used 64K row batch size. I haven't implemented the optional
>>>>>> non-compressed buffers (for cases where there is little space savings)
>>>>>> so everything is compressed. I can check different batch sizes if you
>>>>>> like
>>>>>>
>>>>>>
>>>>>>> On Mon, Mar 23, 2020 at 4:40 PM Wes McKinney <wesmck...@gmail.com>
>>>>>> wrote:
>>>>>>>
>>>>>>>> hi folks,
>>>>>>>>
>>>>>>>> Sorry it's taken me a little while to produce supporting benchmarks.
>>>>>>>>
>>>>>>>> * I implemented experimental trivial body buffer compression in
>>>>>>>> https://github.com/apache/arrow/pull/6638
>>>>>>>> * I hooked up the Arrow IPC file format with compression as the new
>>>>>>>> Feather V2 format in
>>>>>>>> https://github.com/apache/arrow/pull/6694#issuecomment-602906476
>>>>>>>>
>>>>>>>> I tested a couple of real-world datasets from a prior blog post
>>>>>>>> https://ursalabs.org/blog/2019-10-columnar-perf/ with ZSTD and LZ4
>>>>>>>> codecs
>>>>>>>>
>>>>>>>> The complete results are here
>>>>>>>> https://github.com/apache/arrow/pull/6694#issuecomment-602906476
>>>>>>>>
>>>>>>>> Summary:
>>>>>>>>
>>>>>>>> * Compression ratios ranging from ~50% with LZ4 and ~75% with ZSTD on
>>>>>>>> the Taxi dataset to ~87% with LZ4 and ~90% with ZSTD on the Fannie Mae
>>>>>>>> dataset. So that's a huge space savings
>>>>>>>> * Single-threaded decompression times exceeding 2-4GByte/s with LZ4
>>>>>>>> and 1.2-3GByte/s with ZSTD
>>>>>>>>
>>>>>>>> I would have to do some more engineering to test throughput changes
>>>>>>>> with Flight, but given these results on slower networking (e.g. 1
>>>>>>>> Gigabit) my guess is that the compression and decompression overhead
>>>>>>>> is little compared with the time savings due to high compression
>>>>>>>> ratios. If people would like to see these numbers to help make a
>>>>>>>> decision I can take a closer look
>>>>>>>>
>>>>>>>> As far as what Micah said about having a limited number of
>>>>>>>> compressors: I would be in favor of having just LZ4 and ZSTD. It seems
>>>>>>>> anecdotally that these outperform Snappy in most real world scenarios
>>>>>>>> and generally have > 1 GB/s decompression performance. Some Linux
>>>>>>>> distributions (Arch at least) have already started adopting ZSTD over
>>>>>>>> LZMA or GZIP [1]
>>>>>>>>
>>>>>>>> - Wes
>>>>>>>>
>>>>>>>> [1]:
>>>>>>>>
>>>>>> https://www.archlinux.org/news/now-using-zstandard-instead-of-xz-for-package-compression/
>>>>>>>>
>>>>>>>> On Fri, Mar 6, 2020 at 8:42 AM Fan Liya <liya.fa...@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>> Hi Wes,
>>>>>>>>>
>>>>>>>>> Thanks a lot for the additional information.
>>>>>>>>> Looking forward to see the good results from your experiments.
>>>>>>>>>
>>>>>>>>> Best,
>>>>>>>>> Liya Fan
>>>>>>>>>
>>>>>>>>> On Thu, Mar 5, 2020 at 11:42 PM Wes McKinney <wesmck...@gmail.com>
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> I see, thank you.
>>>>>>>>>>
>>>>>>>>>> For such a scenario, implementations would need to define a
>>>>>>>>>> "UserDefinedCodec" interface to enable codecs to be registered from
>>>>>>>>>> third party code, similar to what is done for extension types [1]
>>>>>>>>>>
>>>>>>>>>> I'll update this thread when I get my experimental C++ patch up to
>>>>>> see
>>>>>>>>>> what I'm thinking at least for the built-in codecs we have like
>>>>>> ZSTD.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>> https://github.com/apache/arrow/blob/apache-arrow-0.16.0/docs/source/format/Columnar.rst#extension-types
>>>>>>>>>>
>>>>>>>>>> On Thu, Mar 5, 2020 at 7:56 AM Fan Liya <liya.fa...@gmail.com>
>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>> Hi Wes,
>>>>>>>>>>>
>>>>>>>>>>> Thanks a lot for your further clarification.
>>>>>>>>>>>
>>>>>>>>>>> Some of my prelimiary thoughts:
>>>>>>>>>>>
>>>>>>>>>>> 1. We assign a unique GUID to each pair of
>>>>>> compression/decompression
>>>>>>>>>>> strategies. The GUID is stored as part of the
>>>>>>>> Message.custom_metadata.
>>>>>>>>>> When
>>>>>>>>>>> receiving the GUID, the receiver knows which decompression
>>>>>> strategy
>>>>>>>> to
>>>>>>>>>> use.
>>>>>>>>>>>
>>>>>>>>>>> 2. We serialize the decompression strategy, and store it into the
>>>>>>>>>>> Message.custom_metadata. The receiver can decompress data after
>>>>>>>>>>> deserializing the strategy.
>>>>>>>>>>>
>>>>>>>>>>> Method 1 is generally used in static strategy scenarios while
>>>>>> method
>>>>>>>> 2 is
>>>>>>>>>>> generally used in dynamic strategy scenarios.
>>>>>>>>>>>
>>>>>>>>>>> Best,
>>>>>>>>>>> Liya Fan
>>>>>>>>>>>
>>>>>>>>>>> On Wed, Mar 4, 2020 at 11:39 PM Wes McKinney <
>>>>>> wesmck...@gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Okay, I guess my question is how the receiver is going to be
>>>>>> able
>>>>>>>> to
>>>>>>>>>>>> determine how to "rehydrate" the record batch buffers:
>>>>>>>>>>>>
>>>>>>>>>>>> What I've proposed amounts to the following:
>>>>>>>>>>>>
>>>>>>>>>>>> * UNCOMPRESSED: the current behavior
>>>>>>>>>>>> * ZSTD/LZ4/...: each buffer is compressed and written with an
>>>>>> int64
>>>>>>>>>>>> length prefix
>>>>>>>>>>>>
>>>>>>>>>>>> (I'm close to putting up a PR implementing an experimental
>>>>>> version
>>>>>>>> of
>>>>>>>>>>>> this that uses Message.custom_metadata to transmit the codec,
>>>>>> so
>>>>>>>> this
>>>>>>>>>>>> will make the implementation details more concrete)
>>>>>>>>>>>>
>>>>>>>>>>>> So in the USER_DEFINED case, how will the library know how to
>>>>>>>> obtain
>>>>>>>>>>>> the uncompressed buffer? Is some additional metadata structure
>>>>>>>>>>>> required to provide instructions?
>>>>>>>>>>>>
>>>>>>>>>>>> On Wed, Mar 4, 2020 at 8:05 AM Fan Liya <liya.fa...@gmail.com>
>>>>>>>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>> Hi Wes,
>>>>>>>>>>>>>
>>>>>>>>>>>>> I am thinking of adding an option named "USER_DEFINED" (or
>>>>>>>> something
>>>>>>>>>>>>> similar) to enum CompressionType in your proposal.
>>>>>>>>>>>>> IMO, this option should be used primarily in Flight.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Best,
>>>>>>>>>>>>> Liya Fan
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Wed, Mar 4, 2020 at 11:12 AM Wes McKinney <
>>>>>>>> wesmck...@gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Tue, Mar 3, 2020, 8:11 PM Fan Liya <
>>>>>> liya.fa...@gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Sure. I agree with you that we should not overdo this.
>>>>>>>>>>>>>>> I am wondering if we should provide an option to allow
>>>>>> users
>>>>>>>> to
>>>>>>>>>>>> plugin
>>>>>>>>>>>>>>> their customized compression strategies.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Can you provide a patch showing changes to Message.fbs (or
>>>>>>>>>> Schema.fbs)
>>>>>>>>>>>> that
>>>>>>>>>>>>>> make this idea more concrete?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>> Liya Fan
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Tue, Mar 3, 2020 at 9:47 PM Wes McKinney <
>>>>>>>> wesmck...@gmail.com
>>>>>>>>>>>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Tue, Mar 3, 2020, 7:36 AM Fan Liya <
>>>>>>>> liya.fa...@gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I am so glad to see this discussion, and I am
>>>>>> willing to
>>>>>>>>>> provide
>>>>>>>>>>>> help
>>>>>>>>>>>>>>>> from
>>>>>>>>>>>>>>>>> the Java side.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> In the proposal, I see the support for basic
>>>>>> compression
>>>>>>>>>>>> strategies
>>>>>>>>>>>>>>>>> (e.g.gzip, snappy).
>>>>>>>>>>>>>>>>> IMO, applying a single basic strategy is not likely
>>>>>> to
>>>>>>>>>> achieve
>>>>>>>>>>>>>>>> performance
>>>>>>>>>>>>>>>>> improvement for most scenarios.
>>>>>>>>>>>>>>>>> The optimal compression strategy is often obtained by
>>>>>>>>>> composing
>>>>>>>>>>>> basic
>>>>>>>>>>>>>>>>> strategies and tuning parameters.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I hope we can support such highly customized
>>>>>> compression
>>>>>>>>>>>> strategies.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I think very much beyond trivial one-shot buffer level
>>>>>>>>>> compression
>>>>>>>>>>>> is
>>>>>>>>>>>>>>>> probably out of the question for addition to the
>>>>>> current
>>>>>>>>>>>> "RecordBatch"
>>>>>>>>>>>>>>>> Flatbuffers type, because the additional metadata
>>>>>> would add
>>>>>>>>>>>> undesirable
>>>>>>>>>>>>>>>> bloat (which I would be against). If people have other
>>>>>>>> ideas it
>>>>>>>>>>>> would
>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>> great to see exactly what you are thinking as far as
>>>>>>>> changes
>>>>>>>>>> to the
>>>>>>>>>>>>>>>> protocol files.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I'll try to assemble some examples to show the
>>>>>> before/after
>>>>>>>>>>>> results of
>>>>>>>>>>>>>>>> applying the simple strategy.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>> Liya Fan
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Tue, Mar 3, 2020 at 8:15 PM Antoine Pitrou <
>>>>>>>>>>>> anto...@python.org>
>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> If we want to use a HTTP header, it would be more
>>>>>> of a
>>>>>>>>>>>>>>> Accept-Encoding
>>>>>>>>>>>>>>>>>> header, no?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> In any case, we would have to put non-standard
>>>>>> values
>>>>>>>> there
>>>>>>>>>>>> (e.g.
>>>>>>>>>>>>>>> lz4),
>>>>>>>>>>>>>>>>>> so I'm not sure how desirable it is to repurpose
>>>>>> HTTP
>>>>>>>>>> headers
>>>>>>>>>>>> for
>>>>>>>>>>>>>>> that,
>>>>>>>>>>>>>>>>>> rather than add some dedicated field to the Flight
>>>>>>>>>> messages.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Regards
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Antoine.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Le 03/03/2020 à 12:52, David Li a écrit :
>>>>>>>>>>>>>>>>>>> gRPC supports headers so for Flight, we could
>>>>>> send
>>>>>>>>>>>> essentially an
>>>>>>>>>>>>>>>>> Accept
>>>>>>>>>>>>>>>>>>> header and perhaps a Content-Type header.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> David
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> On Mon, Mar 2, 2020, 23:15 Micah Kornfield <
>>>>>>>>>>>>>> emkornfi...@gmail.com>
>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Hi Wes,
>>>>>>>>>>>>>>>>>>>> A few thoughts on this.  In general, I think it
>>>>>> is a
>>>>>>>>>> good
>>>>>>>>>>>> idea.
>>>>>>>>>>>>>>> But
>>>>>>>>>>>>>>>>>> before
>>>>>>>>>>>>>>>>>>>> proceeding, I think the following points are
>>>>>> worth
>>>>>>>>>>>> discussing:
>>>>>>>>>>>>>>>>>>>> 1.  Does this actually improve
>>>>>> throughput/latency
>>>>>>>> for
>>>>>>>>>>>> Flight? (I
>>>>>>>>>>>>>>>> think
>>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>>> mentioned you would follow-up with benchmarks).
>>>>>>>>>>>>>>>>>>>> 2.  I think we should limit the number of
>>>>>> supported
>>>>>>>>>>>> compression
>>>>>>>>>>>>>>>>> schemes
>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> only 1 or 2.  I think the criteria for selection
>>>>>>>> speed
>>>>>>>>>> and
>>>>>>>>>>>>>> native
>>>>>>>>>>>>>>>>>>>> implementations available across the widest
>>>>>> possible
>>>>>>>>>>>> languages.
>>>>>>>>>>>>>>> As
>>>>>>>>>>>>>>>>> far
>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>> i can tell zstd only have bindings in java via
>>>>>> JNI,
>>>>>>>> but
>>>>>>>>>> my
>>>>>>>>>>>>>>>>>> understanding is
>>>>>>>>>>>>>>>>>>>> it is probably the type of compression for our
>>>>>>>>>> use-cases.
>>>>>>>>>>>> So I
>>>>>>>>>>>>>>>> think
>>>>>>>>>>>>>>>>>>>> zstd + potentially 1 more.
>>>>>>>>>>>>>>>>>>>> 3.  Commitment from someone on the Java side to
>>>>>>>>>> implement
>>>>>>>>>>>> this.
>>>>>>>>>>>>>>>>>>>> 4.  This doesn't need to be coupled with this
>>>>>> change
>>>>>>>>>> per-se
>>>>>>>>>>>> but
>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>> something like flight it would be good to have a
>>>>>>>>>> standard
>>>>>>>>>>>>>>> mechanism
>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>> negotiating server/client capabilities (e.g.
>>>>>> client
>>>>>>>>>> doesn't
>>>>>>>>>>>>>>> support
>>>>>>>>>>>>>>>>>>>> compression or only supports a subset).
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>> Micah
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> On Sun, Mar 1, 2020 at 1:24 PM Wes McKinney <
>>>>>>>>>>>>>> wesmck...@gmail.com>
>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> On Sun, Mar 1, 2020 at 3:14 PM Antoine Pitrou <
>>>>>>>>>>>>>>> anto...@python.org>
>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Le 01/03/2020 à 22:01, Wes McKinney a écrit :
>>>>>>>>>>>>>>>>>>>>>>> In the context of a "next version of the
>>>>>> Feather
>>>>>>>>>> format"
>>>>>>>>>>>>>>>> ARROW-5510
>>>>>>>>>>>>>>>>>>>>>>> (which is consumed only by Python and R at
>>>>>> the
>>>>>>>>>> moment), I
>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>> been
>>>>>>>>>>>>>>>>>>>>>>> looking at compressing buffers using fast
>>>>>>>> compressors
>>>>>>>>>>>> like
>>>>>>>>>>>>>> ZSTD
>>>>>>>>>>>>>>>>> when
>>>>>>>>>>>>>>>>>>>>>>> writing the RecordBatch bodies. This could be
>>>>>>>> handled
>>>>>>>>>>>>>> privately
>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>> implementation detail of the Feather file,
>>>>>> but
>>>>>>>> since
>>>>>>>>>> ZSTD
>>>>>>>>>>>>>>>>> compression
>>>>>>>>>>>>>>>>>>>>>>> could improve throughput in Flight, for
>>>>>> example,
>>>>>>>> I
>>>>>>>>>>>> thought I
>>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>> bring it up for discussion.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> I can see two simple compression strategies:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> * Compress the entire message body in
>>>>>> one-shot,
>>>>>>>>>> writing
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>> result
>>>>>>>>>>>>>>>>>>>> out
>>>>>>>>>>>>>>>>>>>>>>> with an 8-byte int64 prefix indicating the
>>>>>>>>>> uncompressed
>>>>>>>>>>>> size
>>>>>>>>>>>>>>>>>>>>>>> * Compress each non-zero-length constituent
>>>>>>>> Buffer
>>>>>>>>>> prior
>>>>>>>>>>>> to
>>>>>>>>>>>>>>>> writing
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> the body (and using the same
>>>>>>>>>> uncompressed-length-prefix
>>>>>>>>>>>> when
>>>>>>>>>>>>>>>>> writing
>>>>>>>>>>>>>>>>>>>>>>> the compressed buffer)
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> The latter strategy is preferable for
>>>>>> scenarios
>>>>>>>>>> where we
>>>>>>>>>>>> may
>>>>>>>>>>>>>>>>> project
>>>>>>>>>>>>>>>>>>>>>>> out only a few fields from a larger record
>>>>>> batch
>>>>>>>>>> (such as
>>>>>>>>>>>>>>> reading
>>>>>>>>>>>>>>>>>>>> from
>>>>>>>>>>>>>>>>>>>>>>> a memory-mapped file).
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Agreed.  It may also allow using different
>>>>>>>> compression
>>>>>>>>>>>>>>> strategies
>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>> different kinds of buffers (for example a
>>>>>>>> bytestream
>>>>>>>>>>>> splitting
>>>>>>>>>>>>>>>>>> strategy
>>>>>>>>>>>>>>>>>>>>>> for floats and doubles, or a delta encoding
>>>>>>>> strategy
>>>>>>>>>> for
>>>>>>>>>>>>>>>> integers).
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> If we wanted to allow for different
>>>>>> compression to
>>>>>>>>>> apply to
>>>>>>>>>>>>>>>> different
>>>>>>>>>>>>>>>>>>>>> buffers, I think we will need a new Message
>>>>>> type
>>>>>>>>>> because
>>>>>>>>>>>> this
>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>> inflate metadata sizes in a way that is not
>>>>>> likely
>>>>>>>> to
>>>>>>>>>> be
>>>>>>>>>>>>>>> acceptable
>>>>>>>>>>>>>>>>>>>>> for the current uncompressed use case.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Here is my strawman proposal
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>> https://github.com/apache/arrow/compare/master...wesm:compression-strawman
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Implementation could be accomplished by one
>>>>>> of
>>>>>>>> the
>>>>>>>>>>>> following
>>>>>>>>>>>>>>>>> methods:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> * Setting a field in Message.custom_metadata
>>>>>>>>>>>>>>>>>>>>>>> * Adding a new field to Message
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> I think it has to be a new field in Message.
>>>>>>>> Making
>>>>>>>>>> it an
>>>>>>>>>>>>>>>> ignorable
>>>>>>>>>>>>>>>>>>>>>> metadata field means non-supporting receivers
>>>>>> will
>>>>>>>>>> decode
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>> interpret
>>>>>>>>>>>>>>>>>>>>>> the data wrongly.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Regards
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Antoine.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>

Reply via email to