Repository navigation
feat(ipc): Skip unchanged dictionaries in ArrowIpcWriterWriteArrayViewWithDictionaries - #979
Open
rustyconover wants to merge 1 commit into
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #979 +/- ##
==========================================
+ Coverage 78.52% 78.56% +0.04%
==========================================
Files 106 106
Lines 17195 17334 +139
Branches 2064 2108 +44
==========================================
+ Hits 13502 13619 +117
- Misses 2431 2432 +1
- Partials 1262 1283 +21 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
rustyconover
force-pushed
the
feat/ipc-writer-skip-unchanged-view-dictionaries
branch
2 times, most recently
from
October 20, 2026 22:34
3aa0b89 to
57c4810
Compare
…wWithDictionaries ArrowIpcWriterWriteArrayViewWithDictionaries() wrote every dictionary before every RecordBatch: its input is borrowed, so it couldn't compare a dictionary with the previous batch's by address as ArrowIpcWriterWriteArrayStream() does. The writer now keeps a copy of each dictionary it writes and compares the next batch's values with it, writing only dictionaries that changed (and those whose values contain a nested dictionary that was written). In a file, batches whose dictionaries are unchanged can now be written this way. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
rustyconover
force-pushed
the
feat/ipc-writer-skip-unchanged-view-dictionaries
branch
from
October 26, 2026 16:05
57c4810 to
8f8e296
Compare
rustyconover
marked this pull request as ready for review
October 26, 2026 16:24
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Rebased onto current
main; prerequisites #928 and #968 have merged. This PR now contains only the dictionary value deduplication change.ArrowIpcWriterWriteArrayViewWithDictionaries()(#968) writes every dictionary before every RecordBatch. Its input is borrowed, so it can't do whatArrowIpcWriterWriteArrayStream()does (#928): keep the previous array alive and compare dictionaries by buffer address. A producer that writes batches one at a time with the same dictionary therefore sends that dictionary again with every batch. In a file, where a dictionary ID may be written only once, it can't write a second batch with dictionaries at all.The writer now keeps a copy of each dictionary this function writes, keyed by dictionary ID, and compares the next batch's values with it:
ArrowArrayViewCompare(..., NANOARROW_COMPARE_IDENTICAL, ...)). This is the common case, e.g. when the producer builds each batch's dictionary the same way, and it needs no copy.ArrowArrayAppendStorageFromArrayView()doesn't support dense unions) are written every time, as before.ArrowIpcWriterWriteDictionaryBatch()drops the saved copy for its ID, so a dictionary written that way is never skipped by mistake, andArrowIpcWriterWriteSchema()drops all of them.ArrowIpcWriterWriteArrayStream()is unchanged. The function's documentation now describes this, including the cost: a copy of each dictionary that is written.Cost: 1000 batches of 2048 rows,
dictionary<int32, string>with 10,000 values, written to a memory buffer (Release, Linux aarch64; best of 3):A dictionary that changes on every batch costs a copy per batch. The follow-up, #980, writes a dictionary that only grew as a delta, which brings that row to 346 ms and 9.2 MB.
Tests (
writer_test.cc):WriteArrayViewWithDictionariesSkipsUnchanged: separately built arrays with dictionaries[foo, bar], [foo, bar], [foo, baz], [foo, baz]write two DictionaryBatches. Read back with nanoarrow and Arrow C++.WriteArrayViewWithDictionariesComparesValues: anint64dictionary[1, null, 3], then the same values as a slice of a longer array with an unknown null count and padding bits set, write one DictionaryBatch.WriteArrayViewWithDictionariesNested: when only a nested dictionary changes, both it and the dictionary that refers to it are written (IDs1, 0, 1, 0over three batches).WriteArrayViewWithDictionariesAfterWriteDictionaryBatch: a dictionary written withArrowIpcWriterWriteDictionaryBatch()in between isn't mistaken for the saved copy.WriteArrayViewWithDictionariesUncopyableValues: a dense union dictionary is written for every batch.WriteArrayViewWithDictionariesInFilenow writes a second, unchanged batch to the file, checks that a changed dictionary returns ENOTSUP, and reads the file back with Arrow C++.Against #968's
writer.c, the first three new tests and the updated file test fail.ctestpasses (Linux aarch64, Debug, 878 tests withNANOARROW_BUILD_TESTS_WITH_ARROW), and 403 tests under ASan/UBSan with clang. The writer tests are clean under valgrind. The changed files are formatted with clang-format 16.0.6, the pre-commit version.This PR's code and description were written by AI (Claude Code) and reviewed by a human maintainer.
🤖 Generated with Claude Code
Validation after rebasing (October 26): macOS arm64 Debug, 426 CTest cases, no failures; 16 compression cases skipped because compression is disabled in this build.