[
https://issues.apache.org/jira/browse/ARROW-10739?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17239312#comment-17239312
]
Maarten Breddels commented on ARROW-10739:
------------------------------------------
Ok, good to know.
Two workarounds I came up with
{code:java}
%%timeit
s = pa.serialize(ar.slice(10, 1))
ar2 = pa.deserialize(s.to_buffer())
790 µs ± 578 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
{code}
{code:java}
import vaex.arrow.convert
----
def trim_buffers(ar):
'''
>>> ar = pa.array([1, 2, 3, 4], pa.int8())
>>> ar.nbytes
4
>>> ar.slice(2, 2) #doctest: +ELLIPSIS
<pyarrow.lib.Int8Array object at 0x...>
[
3,
4
]
>>> ar.slice(2, 2).nbytes
4
>>> trim_buffers(ar.slice(2, 2)).nbytes
2
>>> trim_buffers(ar.slice(2, 2))#doctest: +ELLIPSIS
<pyarrow.lib.Int8Array object at 0x...>
[
3,
4
]
'''
schema = pa.schema({'x': ar.type})
with pa.BufferOutputStream() as sink:
with pa.ipc.new_stream(sink, schema) as writer:
writer.write_table(pa.table({'x': ar}))
with pa.BufferReader(sink.getvalue()) as source:
with pa.ipc.open_stream(source) as reader:
table = reader.read_all()
assert table.num_columns == 1
assert table.num_rows == len(ar)
trimmed_ar = table.column(0)
if isinstance(trimmed_ar, pa.ChunkedArray):
assert len(trimmed_ar.chunks) == 1
trimmed_ar = trimmed_ar.chunks[0]
return trimmed_ar
----
%%timeit
vaex.arrow.convert.trim_buffers(ar.slice(10, 1))
202 µs ± 2.31 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
{code}
> [Python] Pickling a sliced array serializes all the buffers
> -----------------------------------------------------------
>
> Key: ARROW-10739
> URL: https://issues.apache.org/jira/browse/ARROW-10739
> Project: Apache Arrow
> Issue Type: Bug
> Components: Python
> Reporter: Maarten Breddels
> Priority: Major
>
> If a large array is sliced, and pickled, it seems the full buffer is
> serialized, this leads to excessive memory usage and data transfer when using
> multiprocessing or dask.
> {code:java}
> >>> import pyarrow as pa
> >>> ar = pa.array(['foo'] * 100_000)
> >>> ar.nbytes
> 700004
> >>> import pickle
> >>> len(pickle.dumps(ar.slice(10, 1)))
> 700165
> NumPy for instance
> >>> import numpy as np
> >>> ar_np = np.array(ar)
> >>> ar_np
> array(['foo', 'foo', 'foo', ..., 'foo', 'foo', 'foo'], dtype=object)
> >>> import pickle
> >>> len(pickle.dumps(ar_np[10:11]))
> 165{code}
> I think this makes sense if you know arrow, but kind of unexpected as a user.
> Is there a workaround for this? For instance copy an arrow array to get rid
> of the offset, and trim the buffers?
--
This message was sent by Atlassian Jira
(v8.3.4#803005)