Several fixes for writing large Arrow tables (#57)
authorJacob Quinn <quinn.jacobd@gmail.com>
Wed, 4 Nov 2020 00:23:25 +0000 (17:23 -0700)
committerGitHub <noreply@github.com>
Wed, 4 Nov 2020 00:23:25 +0000 (17:23 -0700)
commite07c7cc993fab6a2de6883a9b718cd9e6e119cc6
tree7688b2984bceaaf2f8997881accfe941e9139b2c
parent8583da8a84a9e355affb42654dcd8c765bcc3134
Several fixes for writing large Arrow tables (#57)

* Switch FlatBuffer Array type to use Int64 for byte position

Fixes #56. The issue was the underlying flatbuffer array type was using
an `UInt32` for the byte position where the flatbuffer array was
located; in super large files, this overflowed. As this Array field is a
Julia-side controlled type, we can easily switch to an Int64 to avoid
this issue all together.

* A few optimizations when writing

The bitpack encoding algorithm was allocating, which caused very large
tables to slow down considerably with so much memory recycling.
Rewriting it to avoid allocations leads to drastically fewer allocations
and much faster writing performance. For non-optimized array writing, we
also switch to writing to a buffer first to avoid hitting the global IO
lock too much, which can also hurt performance on large files.

* A few fixes for dictionary encoding writing

Just a few minor cleanups to ensure dictionary encoding types are
consistent, and that variable names work correctly between writing
first-time dictionary encodings and deltas.

* a few fixes
src/FlatBuffers/table.jl
src/arraytypes/arraytypes.jl
src/arraytypes/bool.jl
src/arraytypes/dictencoding.jl
src/eltypes.jl
src/table.jl
src/utils.jl