Skip to content

[C++][Parquet] Fast-path fixed-length LIST reads - #55197

Draft
wgtmac wants to merge 2 commits into
apache:mainfrom
wgtmac:codex/parquet-fixed-list-fast-path
Draft

wgtmac wants to merge 2 commits into
apache:mainfrom
wgtmac:codex/parquet-fixed-list-fast-path

Conversation

@wgtmac

@wgtmac wgtmac commented Oct 24, 2026 •

Copy link
Copy Markdown
Member

Rationale for this change

Parquet LIST columns that are effectively fixed-length, such as vector embeddings, pay the full Dremel definition/repetition-level reconstruction cost on read. This patch adds a page-level fast path that detects fixed-length LIST pages and reads their child values directly.

What changes are included in this PR?

  • Add a reader property, ArrowReaderProperties::set_fixed_list_fast_path(bool), disabled by default.
  • Inspect encoded definition/repetition levels for non-nullable LIST pages and infer a fixed list width.
  • Read fixed-length child values across data pages without materializing the normal Dremel level arrays.
  • Preserve the existing path for nullable or unsupported nested columns.
  • Carry the list phase across page boundaries, including pages that split a repeated record.
  • Add PLAIN, BYTE_STREAM_SPLIT, and ALP benchmarks for ordinary LIST and FixedSizeList columns.
  • Add a design and benchmark report in parquet_vector_reader_optimization.md.

Are these changes tested?

  • make -C cpp/build-release -j8 parquet
  • make -C cpp/build-release -j8 parquet_shared
  • make -C cpp/build-release -j8 parquet-benchmarks using Conan's local benchmark/1.9.4 package
  • 158 relevant LIST/FixedSizeList reader tests pass
  • clang-format --dry-run --Werror passes for modified C++ files
  • Release Google Benchmark runs cover PLAIN, BYTE_STREAM_SPLIT, and ALP at list widths 3, 16, and 768

The previous macOS Intel CI run also reported arrow-s3fs-test and arrow-s3fs-module-test timeouts; these are unrelated S3 test timeouts rather than failures in the modified Parquet targets.

Are there any user-facing changes?

Yes. Applications can opt into the fixed-length LIST fast path with ArrowReaderProperties::set_fixed_list_fast_path(true). It remains disabled by default. If enabled for a variable-width LIST and a later page changes width after values have been consumed, the reader returns an explicit error instructing callers to disable the property.

Was AI used for this PR?

Yes. AI was used to research the Hardwood fixed-length LIST design, implement the reader fast path and benchmarks, investigate CI failures, and analyze benchmark output. The code and PR description were reviewed in the local workspace before submission.

PR code and description written by:

  • Human
  • AI

Reviewed before submission by:

  • Human
  • AI
  • Not reviewed

@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

This pull request has been automatically converted to a draft because its title doesn't match Arrow's required format.

If this is not a minor PR, could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

After updating the title, you can mark the pull request as ready for review.

See also:

@github-actions github-actions Bot added the awaiting review Awaiting review label Oct 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant