Writer: numeric dict layout is chosen by a 2,048-distinct cap; Rust probes and writes several dictionaries
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 28/100
Direção de pesquisa
Start in DictColumnState.isDictCandidate and the GLOBAL_DICT_MAX_CARDINALITY cap in vortex-java, then compare with DictStrategy in vortex-layout/src/layouts/dict/writer.rs, which probes a sample and writes several dictionaries. Read ADR 0021 before changing the heuristic. Reproduce with Int64NarrowingInteropIntegrationTest using a one-column HASH_CSV dump. Done means the RefererHash tree matches the vortex-jni dict layout and high-cardinality I64/F64 columns show no regressions.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Raincloud clickbench-hits, vortex-java's Parquet import vs the vortex-jni-written file, data bytes (99.997M rows):
| column | type | Rust | Java |
|---|---|---|---|
| RefererHash | I64 | 401.0 MB | 791.3 MB (1.97x) |
| URLHash | I64 | 427.3 MB | 790.0 MB (1.85x) |
Cause (confirmed)
Not integer narrowing: the values are full 64-bit. Rust writes these columns as a dict layout; Java writes plain vortex.primitive (8 bytes a row).
Reproduced with 131,072 real RefererHash rows (first chunk of ClickBench hits.parquet, ~23k distinct), written by both writers:
| file | tree | |
|---|---|---|
| vortex-jni | 434 KB | vortex.dict layout: vortex.primitive values + fastlanes.bitpacked codes |
| vortex-java | 1,050 KB | vortex.primitive |
Synthetic i32/u32/i16-range, mixed and full-i64 columns already produce identical trees in both writers, so narrowing is not involved.
- Rust (
vortex-layout/src/layouts/dict/writer.rs,DictStrategy): compresses a probe sample with the cascade; if the result is aDict, it writes a dict layout, up tou16::MAXvalues per dictionary, and starts a new dictionary when the constraint is hit. - Java (
DictColumnState.isDictCandidate): a numeric column is offered a global dict only with at mostGLOBAL_DICT_MAX_CARDINALITY(2,048) distinct values and under 50% distinct, one dictionary for the whole column, demoted to per-chunk encoding past the cap. This column has ~23k distinct per chunk and ~719k over 2M rows.
Fix
Raising the cap is not enough: over the whole column Rust writes several dictionaries in sequence. Parity means replacing the cardinality heuristic with Rust's probe-then-multi-dictionary flow (touches ADR 0021, and the comment on the cap says a global dict hurt some high-cardinality I64/F64 columns, so check those for regressions).
Repro: Int64NarrowingInteropIntegrationTest (exploratory, not committed), fed HASH_CSV=<one-column dump>.
- Linguagem predominante
- Java
- Estrelas
- 3
- Forks
- 2
- Merge médio
- 9h 47min
- PRs com merge (30d)
- 128
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de dfa1/vortex-java
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
dfa1/vortex-java#636 ·
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 70/100
dfa1/vortex-java#655 ·
Mantenedores costumam responder em até 1 dia
-
perf
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 30/100
dfa1/vortex-java#651 ·
Mantenedores costumam responder em até 1 dia
-
Writer: string columns written as per-chunk dicts where Rust uses its dict layout (up to 2x larger)Abertaperf
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 30/100
dfa1/vortex-java#650 ·
Mantenedores costumam responder em até 1 dia
-
perf
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 18/100
dfa1/vortex-java#648 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de dfa1/vortex-java
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
a2aproject/a2a-java#1275 ·
Mantenedores costumam responder em até 1 dia
-
module/ftp Type/Bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
ballerina-platform/ballerina-library#9476 ·
Mantenedores costumam responder em até 1 dia
-
enhancement
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
anwilli5/coin-collection-android-US#515 ·
Mantenedores costumam responder em até 1 dia
-
status: waiting-for-triage type: bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
spring-projects/spring-integration#11654 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 Menos de uma hora Facilidade para iniciantes 70/100
Vakore/ZappierGames#248 ·