Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
76f94b2
JVM to_json_list: a FLOAT and a float32 float[] arrive as the exact d…
tae898 Nov 9, 2026
946dfda
Native columnar readers: infer Arrow types first, skip per-key and pe…
tae898 Nov 9, 2026
b0f89f9
Native: read each library reply from its address, decode it in one co…
tae898 Nov 9, 2026
cb678b5
Native insert_columns(parallel=True): take the columnar entry (closes…
tae898 Nov 9, 2026
9d6d56c
Native: save() of a new record and new_edge read the row in the cross…
tae898 Nov 9, 2026
25bceaa
Native insert_arrow and insert_dataframe with parallel=True: the same…
tae898 Nov 9, 2026
8bf380c
insert_many and create_vertices: check the rows in the one json.dumps…
tae898 Nov 9, 2026
68bc0a9
Native: column frames for to_arrow, to_columns, to_dataframe and to_p…
tae898 Nov 9, 2026
71bad36
Tests: the frames test builds its SQL as one literal (bandit B608)
tae898 Nov 9, 2026
4b42be7
JVM wheel: a default CDS archive for the bundled JRE, dumped with the…
tae898 Nov 9, 2026
3d09221
Test: keep the nosec of the stale-record test on the line bandit reports
tae898 Nov 9, 2026
aa4504a
JVM insert_columns: a column of str and None crosses as one UTF-8 blo…
tae898 Nov 9, 2026
8d4ec4a
tests: nosec B608 on the test-owned count query, which bandit flagged…
tae898 Nov 9, 2026
7fddca0
Tests: bandit annotations for the seeded corpus and the test-controll…
tae898 Nov 9, 2026
1ff1e64
Native frames: a frame that ends before the replayed first-reply rows…
tae898 Nov 9, 2026
028e877
tests: ingest integrity, count and digest checks after every ingest p…
tae898 Nov 9, 2026
fac44ff
create_vertices: Java float[] and float32 arrays cross as one matrix …
tae898 Nov 9, 2026
c24f154
Native parallel columnar load: interrupt-safe, token-safe, no silent …
tae898 Nov 9, 2026
f2dbc7b
Test: vetoes and first-row errors through the eager form of save() (#…
tae898 Nov 9, 2026
4b317ba
bulk dumps: raise the first bad row's error outside the except block …
tae898 Nov 9, 2026
d606cce
Native frames, second round: no replay of the first reply, types that…
tae898 Nov 9, 2026
dc55dec
tests: a duplicate key in a parallel load abandons the failing writer…
tae898 Nov 9, 2026
79bb519
Native columnar insert: date-time, date, decimal and bytes columns st…
tae898 Nov 9, 2026
ca91fd8
Temporal columnar kinds: refuse out-of-range values in Python, before…
tae898 Nov 9, 2026
9da36d6
Native spy test: count the codec hooks around create_vertices, not ar…
tae898 Nov 9, 2026
cce199f
Test: a statement error has the timing, class and message of the lazy…
tae898 Nov 9, 2026
17ccea5
Native frames: vector types unify to float64, a null vector is None i…
tae898 Nov 9, 2026
c4d41e5
tests: fix the cases of the first candidate run that the temporal kin…
tae898 Nov 9, 2026
9f054a9
insert_dataframe and insert_arrow: a vertex type loads through the co…
tae898 Nov 9, 2026
848a304
Columnar insert: retry a chunk whose commit raises a NeedRetryExcepti…
tae898 Nov 9, 2026
7e81170
create_vertices: decide the whole input before any chunk is sent when…
tae898 Nov 9, 2026
1d5b32e
Tests: a lone surrogate keeps the column off the blob and is refused …
tae898 Nov 9, 2026
e37dd65
integration: merge release/26.11.1.post1-prep (#326: #320 JVM to_json…
tae898 Nov 9, 2026
34b64c6
integration: merge perf/323-native-reply-owner (#327: native reply re…
tae898 Nov 9, 2026
9c1772a
integration: merge perf/317-native-one-row-crossings (#329: a created…
tae898 Nov 9, 2026
80a8cf1
integration: merge perf/318-single-pass-validation (#330: rows checke…
tae898 Nov 9, 2026
916262a
integration: merge perf/337-vector-vertex-loads (#339: Java float[] a…
tae898 Nov 9, 2026
ca17013
integration: merge perf/319-vertex-loads-columnar (#335, with its sta…
tae898 Nov 9, 2026
0ec5399
integration: merge perf/312-native-columnar-frames (#331: native colu…
tae898 Nov 9, 2026
cbebd91
integration: merge perf/324-jvm-string-blob (#334: JVM insert_columns…
tae898 Nov 9, 2026
ced57d5
integration: merge perf/313-jvm-cds-archive (#332: JVM wheel ships a …
tae898 Nov 9, 2026
ca5a0a1
integration: merge test/336-ingest-integrity (#338: ingest integrity …
tae898 Nov 9, 2026
98d0bab
integration: consistency fixes
tae898 Nov 9, 2026
ea6dd0c
Native frames: a null vector is a NaN row in the to_columns matrix wh…
tae898 Nov 9, 2026
4108773
integration: merge perf/312-native-columnar-frames again (#331 ea6dd0…
tae898 Nov 9, 2026
983768c
Merge perf/318-single-pass-validation (#330 7e81170) into perf/337-ve…
tae898 Nov 9, 2026
447a950
insert_arrow and insert_dataframe on the native wheel: a vector colum…
tae898 Nov 9, 2026
9fd4334
create_vertices: no text scan for a table of scalars (g1 regression o…
tae898 Nov 9, 2026
4cc08cf
Test: a map with a non-str key is judged by the walk, not refused by …
tae898 Nov 9, 2026
e773cb0
integration: merge perf/337-vector-vertex-loads again (#339 4cc08cf: …
tae898 Nov 9, 2026
dbb826f
integration: merge perf/319-vertex-loads-columnar again (#335 447a950…
tae898 Nov 9, 2026
cf945e3
Test: the emoji row is no bad value; the old text scan sent it to the…
tae898 Nov 9, 2026
5bae44d
integration: merge perf/337-vector-vertex-loads again (#339 cf945e3: …
tae898 Nov 9, 2026
c6c3999
Test: 300 unread cursors stream instead of holding 300 sorted buffers…
tae898 Nov 10, 2026
dbe1670
integration: merge perf/312-native-columnar-frames again (#331 c6c399…
tae898 Nov 10, 2026
4d2db17
to_dataframe: keep an integer beyond 2**53 next to a float exact (ref…
tae898 Nov 10, 2026
9914e93
perf: a float32 vector column of insert_arrow and insert_dataframe cr…
tae898 Nov 10, 2026
aa223d0
CI: Windows parity harness records crash exit codes, keeps a trace an…
tae898 Nov 10, 2026
34bde23
integration: merge ci/post2-windows-crash-retry (aa223d0: Windows-onl…
tae898 Nov 10, 2026
7f71847
integration: merge fix/340-to-dataframe-int64-exact (4d2db17: to_data…
tae898 Nov 10, 2026
fc7b5e2
CI: parity harness records DIRTY-EXIT, names the log that exists, tol…
tae898 Nov 10, 2026
30ebf9b
integration: merge ci/post2-windows-crash-retry again (fc7b5e2: DIRTY…
tae898 Nov 10, 2026
d82067d
Tests: bandit B105 on the fake tokens, SIGABRT number from the platfo…
tae898 Nov 10, 2026
ece871a
integration: merge ci/post2-windows-crash-retry again (d82067d: nosec…
tae898 Nov 10, 2026
56569a0
integration: merge perf/jvm-arrow-vector-conversion (9914e93: float32…
tae898 Nov 10, 2026
f6b4044
Tests: black 26.10.1 layout for test_arrow_vector_column_jvm.py (the …
tae898 Nov 10, 2026
1fa8c5c
Tests: the nosec B608 markers sit on the line bandit reports (black h…
tae898 Nov 10, 2026
1454809
Test: the vector column heap test no longer uses tracemalloc (it cras…
tae898 Nov 10, 2026
5bc7b8c
Merge the 26.11.1.post2 release line into main
tae898 Nov 10, 2026
0c67d85
Docs: the source comment of "DataFrames, Arrow and columns" names the…
tae898 Nov 10, 2026
b070389
Native readers: the docs-pinning test and the page say what the colum…
tae898 Nov 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .github/workflows/release-native.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ name: Release native (arcadedb)
#
# Nothing here stores a token: the publish job authenticates with PyPI trusted publishing (OIDC), and only that job has the id-token
# permission. The guard in the publish job refuses to publish anything that is not `arcadedb`, so this workflow cannot publish the
# JVM `arcadedb-jvm` by accident.
# JVM `arcadedb-jvm` by accident. The test call carries issues: write too, for the one job of test-native.yml that logs a crash retry
# on issue 295 (see the comment at that call).

on:
push:
Expand Down Expand Up @@ -97,6 +98,12 @@ jobs:
name: Native build and parity
needs: validate-version
uses: ./.github/workflows/test-native.yml
# issues: write is for the `crash-report` job of test-native.yml alone (one comment on issue 295 when a Windows test file crashed and
# passed on its retry). A called workflow cannot hold more permission than its caller gives it, so without this line the whole release
# run would refuse to start; the called workflow's own `permissions: contents: read` keeps every other job read-only.
permissions:
contents: read
issues: write
with:
version: ${{ needs.validate-version.outputs.version }}
release: true
Expand Down
51 changes: 50 additions & 1 deletion .github/workflows/test-native.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@
#
# A leg that passes uploads a marker (native-passed-<platform>-py<version>) and the wheel (native-wheel-<platform>); release-native.yml
# reads them to decide what may be published. Do not rename these artifacts without changing release-native.yml.
#
# Crashes (ArcadeData/arcadedb-python#295): a test file whose process dies without a result is a CRASH row with its exit code, and fails the leg.
# On the Windows legs only, the harness runs such a file once more in a fresh process (--retry-crash): a retry that produces a result is a
# FLAKY-CRASH row, the leg may pass, and the `crash-report` job makes it loud (the job summary, and on a release or a dispatch one comment on
# issue 295); a second crash, a failing test, a timeout and every Linux or macOS crash stay failures. Each Windows test process also writes a
# faulthandler trace into the parity artifact (parity-wheel-xml/<file>.attemptN.fault.txt).
name: Test native (arcadedb)

on:
Expand Down Expand Up @@ -650,12 +656,16 @@ jobs:
cores="$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 2)"
limit=()
if [ "$FINAL" = true ]; then limit=(--max-notyet 0); fi
# A file whose process dies without a result is run once more on Windows only (the crashes of issue 295 are Windows only);
# Linux and macOS stay strict. The harness marks a passing retry FLAKY-CRASH and the crash-report job logs it.
retry=()
if [ "$RUNNER_OS" = Windows ]; then retry=(--retry-crash); fi
# macOS runs bash 3.2: under set -u an empty "${limit[@]}" is "unbound variable", so expand it only when set
uv run --no-project --python "$PY" --with "$w" --with pytest --with setuptools --with numpy --with requests --with jpype1 --with pyarrow \
--with polars --with pandas --with duckdb --with networkx --with "psycopg[binary]" --with adbc-driver-postgresql \
--with redis --with neo4j --with ladybug \
python native/wheel/parity_wheel.py --repo "$GITHUB_WORKSPACE" \
--out "$T/parity/parity-wheel.tsv" --cores "0-$((cores - 1))" ${limit[@]+"${limit[@]}"} | tee "$T/parity/parity-wheel.run.log"
--out "$T/parity/parity-wheel.tsv" --cores "0-$((cores - 1))" ${limit[@]+"${limit[@]}"} ${retry[@]+"${retry[@]}"} | tee "$T/parity/parity-wheel.run.log"

- name: "Gate: no failure, error, crash, timeout or uncounted skip"
run: |
Expand All @@ -665,10 +675,13 @@ jobs:
awk -F'\t' '
NR == 1 { next }
$1 == "TOTAL" { passed = $2; failed = $3; err = $4; notyet = $5; na = $6; skipped = $7; tot = 1; next }
$8 ~ /^FLAKY-CRASH/ { flaky = flaky " " $1 "(" $8 ")"; next }
$8 != "" { bad = bad " " $1 "(" $8 ")" }
END {
if (!tot) { print "no TOTAL row" > "/dev/stderr"; exit 1 }
printf "parity %s py%s: passed=%s failed=%s error=%s notyet=%s na_jvm=%s skipped=%s\n", ENVIRON["KEY"], ENVIRON["PY"], passed, failed, err, notyet, na, skipped
# a file that crashed and passed when run once more: the leg may pass, the summary says it did only because of the retry
if (flaky != "") printf "FLAKY-CRASH (died without a result, passed on the one retry; first exit code in brackets):%s\n", flaky
if (bad != "") { print "files with a status:" bad > "/dev/stderr"; exit 1 }
if (passed + 0 == 0 || failed + 0 != 0 || err + 0 != 0) exit 1
# this repository accepts no skips; NOTYET and NA-JVM are the two counted kinds of the native build
Expand Down Expand Up @@ -696,11 +709,44 @@ jobs:
name: native-parity-${{ matrix.key }}-py${{ matrix.python }}
path: |
${{ runner.temp }}/parity/parity-wheel.tsv
${{ runner.temp }}/parity/parity-wheel.meta.json
${{ runner.temp }}/parity/parity-wheel.run.log
${{ runner.temp }}/parity/parity-wheel-xml/
if-no-files-found: warn
retention-days: 30

# The one job that may write to an issue: after the parity legs it reads their meta files (parity-wheel.meta.json in each native-parity-*
# artifact) and lists every FLAKY-CRASH and CRASH in the job summary; on a release (a tag push) or a dispatch it also posts ONE comment on
# issue 295 (native/wheel/report_flaky_crash.py decides: never on a pull request, only in ArcadeData/arcadedb-python). A log is not a gate: a token
# that cannot write issues, a missing artifact or a gh failure print a warning and the job still ends green. release-native.yml grants the
# issues permission to its call of this workflow, because a called workflow cannot hold more permission than its caller gives it.
crash-report:
name: Report parity crashes
needs: [plan, test]
if: ${{ !cancelled() && needs.plan.outputs.run == 'true' }}
runs-on: ubuntu-24.04
timeout-minutes: 10
continue-on-error: true
permissions:
contents: read
issues: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
continue-on-error: true
with:
pattern: native-parity-*
path: ${{ runner.temp }}/parity-artifacts

- name: List the crashes and log them on issue 295
continue-on-error: true
env:
GH_TOKEN: ${{ github.token }}
run: python3 -I native/wheel/report_flaky_crash.py --artifacts "$RUNNER_TEMP/parity-artifacts"

# The examples of examples/ against the INSTALLED native wheel, so the scripts a new user copies are run on what `uv add arcadedb` installs.
# Nothing is built here: the wheel is the one the build job uploaded (native-wheel-<key>), the file the parity job installs. The platforms are
# those of the parity job and the Pythons are 3.12 and 3.14 (scripts/select_native_matrix.py, `examples`). The runner is scripts/run_examples.sh, the
Expand Down Expand Up @@ -1031,10 +1077,13 @@ jobs:
awk -F'\t' '
NR == 1 { next }
$1 == "TOTAL" { passed = $2; failed = $3; err = $4; notyet = $5; na = $6; skipped = $7; tot = 1; next }
$8 ~ /^FLAKY-CRASH/ { flaky = flaky " " $1 "(" $8 ")"; next }
$8 != "" { bad = bad " " $1 "(" $8 ")" }
END {
if (!tot) { print "no TOTAL row" > "/dev/stderr"; exit 1 }
printf "parity %s py%s: passed=%s failed=%s error=%s notyet=%s na_jvm=%s skipped=%s\n", ENVIRON["KEY"], ENVIRON["PY"], passed, failed, err, notyet, na, skipped
# a file that crashed and passed when run once more: the leg may pass, the summary says it did only because of the retry
if (flaky != "") printf "FLAKY-CRASH (died without a result, passed on the one retry; first exit code in brackets):%s\n", flaky
if (bad != "") { print "files with a status:" bad > "/dev/stderr"; exit 1 }
if (passed + 0 == 0 || failed + 0 != 0 || err + 0 != 0) exit 1
# this repository accepts no skips; NOTYET and NA-JVM are the two counted kinds of the native build
Expand Down
1 change: 1 addition & 0 deletions docs/modules/ROOT/pages/development/ci.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ The workflow `test-native.yml` builds the native image of the `arcadedb` package
* A pull request runs it only when native paths change: `native/**`, `src/arcadedb/**`, `tests/**`, `scripts/select_native_matrix.py` or `test-native.yml` itself. Changes under `tests/` and `src/arcadedb/` are included because both backends share those files, so a shared test or source can break native parity without touching a native file; docs outside those paths do not run it. It then runs on `linux-x86_64` with Python 3.12 only.
* A push to `main`, the nightly run, a manual run (dispatch) run all four platforms: `linux-x86_64`, `linux-aarch64`, `macos-arm64` and `windows-x64` (Python 3.12 and 3.14). A release (`release-native.yml` calls the workflow with `release: true`) runs the same four platforms on all four Python versions, 16 legs.
* The `pyver` job installs the already built `linux-x86_64` wheel (no rebuild) into the Pythons that the full parity runs of the event leave out (3.11, 3.13 and 3.14 on a pull request; 3.11 and 3.13 on a push to `main`, the nightly run and a dispatch; none on a release) into 3.15 and into the free-threaded 3.14t, and runs 13 test files there (14 where polars installs; 3.15 has no jpype1 wheel, so it leaves out the two files that need jpype1), about 20 seconds of tests per Python. It is informational: `release-native.yml` reads only the `native-passed-*` markers and the `native-wheel-*` wheels, so a red `pyver` leg never blocks a release. The 3.14t leg has no polars (no free-threaded wheel exists), so it skips `test_dataframe_ingest.py`. `scripts/select_native_matrix.py` decides its legs.
* Every test file runs in its own process (`native/wheel/parity_wheel.py`). A process that dies without writing its result is a `CRASH` row in `parity-wheel.tsv` with its exit code, for example `CRASH(rc=0xC0000005,3221225477)`, and it fails the leg. On the Windows legs only (the crashes of issue 295 happen there), the harness runs such a file once more in a fresh process (`--retry-crash`). A retry that produces a result is a `FLAKY-CRASH` row: the gate lets the leg pass, the job summary lists the file with the first exit code, and on a release or a dispatch the `crash-report` job adds one comment to issue 295 (run URL, Python, wheel version, exit codes). A second crash, a failing test, a timeout and every crash on Linux or macOS stay failures. A process that wrote its result and then died in shutdown is a `DIRTY-EXIT` record (exit code, file, attempt) in the metadata, the job summary and the issue comment: it is not retried and does not fail the leg. Each Windows test process also writes a faulthandler trace, `parity-wheel-xml/<file>.attemptN.fault.txt`, into the parity artifact of the leg. Only a retry hides a crash, so treat a `FLAKY-CRASH` as an open bug: read the trace in the artifact before a release is announced.
* A native image build takes about 5 to 30 minutes for each platform (macOS is the slowest). The organisation shares one runner limit with upstream ArcadeDB, so do not add runs lightly. Change the paths or the matrix of `test-native.yml` only for a reason that you can write down.

== Change the selection
Expand Down
9 changes: 2 additions & 7 deletions docs/modules/ROOT/pages/how-to/dataframes-and-columns.adoc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
= DataFrames, Arrow and columns
:description: Load a pandas or Polars frame, an Arrow table or whole columns with insert_dataframe, insert_arrow and insert_columns, what each Arrow type becomes, how nulls and NaN are stored, what a declared property accepts, how many rows are converted at a time, what a failed load leaves, and what to_columns, to_arrow, to_dataframe and to_polars return, including the difference between the two builds.

// Sources: src/arcadedb/core.py (insert_columns, insert_dataframe, insert_arrow), dataframe.py, results.py and _native/columns.py (to_columns, to_arrow, to_dataframe, to_polars). The statements below are pinned by tests/test_dataframe_columns_behavior.py, and for the Arrow types, the declared types, the column checks, the readers and the dates also by tests/test_dataframe_ingest.py, tests/test_insert_columns.py, tests/test_resultset_arrow.py, tests/test_columnar_readers.py and tests/test_resultset.py.
// Sources: src/arcadedb/core.py (insert_columns, insert_dataframe, insert_arrow), dataframe.py, results.py, _columnar.py and _native/colframes.py (to_columns, to_arrow, to_dataframe, to_polars). The statements below are pinned by tests/test_dataframe_columns_behavior.py, and for the Arrow types, the declared types, the column checks, the readers and the dates also by tests/test_dataframe_ingest.py, tests/test_insert_columns.py, tests/test_resultset_arrow.py, tests/test_columnar_readers.py and tests/test_resultset.py.

This page covers column-shaped data in and out of a database. Load it with `insert_dataframe` (a pandas or Polars frame), `insert_arrow` (an Arrow table) or `insert_columns` (numpy arrays and lists). Read a result as columns with `to_columns`, `to_arrow`, `to_dataframe` or `to_polars`. For a list of Python dicts use `insert_many`, and for a file use the importer: xref:how-to/bulk-loads.adoc[Bulk loads and commit size] and xref:how-to/import-export.adoc[Importing and exporting data]. The calls here are bindings calls and have no statement in SQL, so the main manual has nothing to say about them. The types that a stored value can have are the engine's: {arcadedb-docs-url}/reference/datatypes[Data types].

Expand Down Expand Up @@ -337,12 +337,7 @@ A missing library does not fail the same way everywhere. `to_columns()` returns

== Differences between the two builds

The calls above, the types and the results are the same on `arcadedb` and `arcadedb-jvm`. Two things differ. The first is how the readers get the rows:

* On `arcadedb-jvm`, `to_columns()` and `to_arrow()` read the result from the engine in batches of `batch_size` rows, as packed columns, so `batch_size` sets how many rows cross at a time.
* On `arcadedb` (native), they read every row into Python dicts first and build the columns from them. `batch_size` is accepted and not used, and the rows exist as Python objects while the columns are built.

The second is the message of a missing pandas: the JVM package adds the `uv add` hint to the `ImportError` of `to_dataframe()`, and the native package raises the plain `ImportError`.
The calls above, the types and the results are the same on `arcadedb` and `arcadedb-jvm`, and so is how `to_columns()` and `to_arrow()` get the rows: both read the result from the engine as packed columns, in requests of at most `batch_size` rows, so `batch_size` sets how many rows cross at a time. One thing differs, the message of a missing pandas: the JVM package adds the `uv add` hint to the `ImportError` of `to_dataframe()`, and the native package raises the plain `ImportError`.

== Related pages

Expand Down
4 changes: 2 additions & 2 deletions docs/modules/ROOT/pages/how-to/vectors.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,9 @@ print(db.count_type("Chunk"))
200
----

`GraphBatch.create_vertices` rows and the properties of `new_edge` and `new_edges` take the same arrays. On the `arcadedb` (native) package, a non-empty one-dimensional `float32` array in a row or an edge property crosses in a binary side buffer, and the stored values are bit-identical to the ones the text path gave. A list or a `float64` array still crosses as number text, so make the array with `np.asarray(v, dtype=np.float32)` before the load. A laptop A/B on the native wheel (100,000 vertices for each load, `ab.py --noise`, ABBA order, 12 clean pairs for each figure, clean A/A control) gave this wall time of the new path against the old one (95 % interval of the median pair ratio): 0.517 [0.515, 0.520] at 128 dimensions, 0.218 [0.217, 0.219] at 96, and 0.271 [0.270, 0.272] at 64. A load without vectors was unchanged (1.009 [1.003, 1.012]).
`GraphBatch.create_vertices` rows and the properties of `new_edge` and `new_edges` take the same arrays. On the `arcadedb` (native) package, a non-empty one-dimensional `float32` array in a row or an edge property crosses in a binary side buffer, and the stored values are bit-identical to the ones the text path gave. A list or a `float64` array still crosses as number text, so make the array with `np.asarray(v, dtype=np.float32)` before the load. When a property holds a `float32` array of one length in every row of a `create_vertices` call, the whole column crosses as one float32 matrix in that buffer, with no tag or Python call for each row. A laptop A/B on the native wheel (100,000 vertices for each load, `ab.py --noise`, ABBA order, 12 clean pairs for each figure, clean A/A control) gave this wall time of the new path against the old one (95 % interval of the median pair ratio): 0.517 [0.515, 0.520] at 128 dimensions, 0.218 [0.217, 0.219] at 96, and 0.271 [0.270, 0.272] at 64. A load without vectors was unchanged (1.009 [1.003, 1.012]).

On the `arcadedb-jvm` package, `create_vertices` already sends the values of a property declared `ARRAY_OF_FLOATS` as one binary float32 matrix when every row holds a list or array of numbers of one length. So `float32` arrays in a property declared `ARRAY_OF_FLOATS` take the binary path on both packages.
On the `arcadedb-jvm` package, `create_vertices` sends the values of a property declared `ARRAY_OF_FLOATS` as one binary float32 matrix when every row holds a list, a numpy array or a Java `float[]` or `double[]` of numbers of one length. A property that is not declared takes the same matrix when every row holds a `float32` numpy array or a Java `float[]` (what `to_java_float_array` returns on this package) of one length, and the stored value is a `float[]`, as before. A list or a `float64` array on an undeclared property keeps its doubles and the older path. So `float32` arrays and `to_java_float_array` values take the binary path on both packages, declared or not.

== Search

Expand Down
5 changes: 5 additions & 0 deletions docs/modules/ROOT/pages/installation.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,11 @@ WARNING: *One JVM configuration per process.* JVM options are locked after the J

Each Python process starts its own JVM, and each JVM sees the whole container limit. With several Python processes in one container, give each process its own `heap_size`.

[[jvm-cds]]
=== Class-data sharing

The bundled JRE ships the JVM's default class-data-sharing archive, dumped with `-XX:+UseCompactObjectHeaders`, the flag that `start_jvm` sets. The JVM finds the archive by itself and maps the JDK's classes from it instead of loading and verifying them at every start. You do nothing to use it. The JVM ignores the archive, and starts as it did before, when your `jvm_args` change a setting that the archive depends on (`-XX:-UseCompactObjectHeaders`, `-Xshare:off`) or when the heap is larger than 32 GB (the default is half of the RAM, so a machine with more than 64 GB of RAM starts without the archive unless you set `heap_size`). The archive holds the JDK's classes only, not the engine's jars.

[[jvm-aot]]
=== Faster start-up with the AOT cache

Expand Down
Loading
Loading