diff --git a/DESIGN.md b/DESIGN.md index 6d075fe7..a3247989 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -1561,17 +1561,49 @@ A pooled backend's own memory is 4–12 MB with the shared cache against the ver *The soak with the shared cache* (`bench/results/soak/*-m9-shared.json`; full scale, PG 16 preloaded, the release build above; case a at the default cap, b-merged at `warren.shared_cache_memory = 8GB`, without its second version, library or community runs). Every query stage reads the shared version, and a backend's private memory falls by the version: case a's stages peak at 0.01–3.11 GB private against 1.22–4.31 GB in the 0.4.0 run, `pagerank` at 1.06 GB against 2.27 GB. The cold load into the shared cache takes 1.5–1.7 s for case a (2.4–3.0 s privately) and 7.4–33.3 s for b-merged's 6.0 GB (22.4–27.1 s privately; the first load reads the segments from disk). Times of stages that read a loaded version are within the run-to-run noise of the 0.4.0 run, except where 0.4.0 reloaded: on b-merged at the default `warren.max_cache_memory`, which no longer counts the version, `bfs` takes 0.89 s (25.1 s), `neighbours` 0.1 ms (19.2 s), `components` 7.6 s (28.6 s) and `pagerank` 16.5 s (38.4 s), as fast as 0.4.0 at an 8GB `warren.max_cache_memory`; `eigen`, refused there before (53400: the version and the solve over the two limits), now runs (135.7 s for 200 steps; it does not converge, as on case a). On case a, `louvain` completed (627.5 s, five levels, modularity 0.121) where the 0.4.0 run was cancelled at 382.7 s by the disk guard; `leiden` fails as in 0.4.0 (53400, compute memory). The `refresh` row is unchanged (a build is private): b-merged's misses at 4.42 GB, as in 0.4.0. -**Text node ids (M10 step 4, §5.7; `bench/results/soak/a-scale2*-m10*.json`).** Case a with IRIs as node ids (`bench/soak.py --ids text`: node *n* is `https://example.org/resource/`, 29 bytes and its digits) against the same case with `bigint` ids, *at half scale* (5M nodes, 50M edges), for the disk: the full-scale text run needs about 16 GB free (the 3.6 GB edge table, the recursive CTE's index, two or three 1.44 GB text versions and WAL, above `--disk-floor`'s 4 GB), and the machine had about 8 GB, shared with other work, so the full run is still to do. *Measured on* the soak's machine and settings (above), a release build of 5f905b4 from a private PG 16.15 tree, without the recursive CTE baseline or the community runs; the second version was skipped for disk, so `diff` and `distance` were not run. Each pair ran back to back under a load average of 2.0–4.4 from other agents' builds, so a time can move by 15–20% for noise alone (`pagerank`, which maps no ids, took 9.1 s against 6.7 s privately and 8.4 s against 7.2 s shared). Figures are text / `bigint`: +**Text node ids (M10 step 4, §5.7; `bench/results/soak/a-scale2*-m10*.json`).** Case a with IRIs as node ids (`bench/soak.py --ids text`: node *n* is `https://example.org/resource/`, 29 bytes and its digits) against the same case with `bigint` ids, first *at half scale* (5M nodes, 50M edges), for the disk (the full-scale run needs about 16 GB free: the 3.6 GB edge table, the recursive CTE's index, two or three 1.44 GB text versions and WAL, above `--disk-floor`; the machine then had about 8 GB), then at full scale (below). *Measured on* the soak's machine and settings (above), a release build of 5f905b4 from a private PG 16.15 tree, without the recursive CTE baseline or the community runs; the second version was skipped for disk, so `diff` and `distance` were not run. Each pair ran back to back under a load average of 2.0–4.4 from other agents' builds, so a time can move by 15–20% for noise alone (`pagerank`, which maps no ids, took 9.1 s against 6.7 s privately and 8.4 s against 7.2 s shared). Figures are text / `bigint`: - *Map size:* the version is 719.5 / 560.6 MB, each within 300 bytes of `bench/soak.py`'s `segment_estimate` (§5.3). The text id map is 238.9 MB (the IRIs' bytes 178.9 MB, `id_offsets` 40 MB, `id_order` 20 MB), against 80 MB of pairs. Cached, 719.5 / 600.6 MB, since a text version builds no dense-id direction when it loads. At full scale: 1.44 / 1.12 GB. - *Build:* `refresh` takes 56.4 / 41.8 s (58.6 / 40.1 s in the shared pair) and peaks at 0.92 / 0.79 GB private (VmHWM 2.08 / 1.95 GB); from the generator query, 61.1 / 46.4 s. Text costs about 35% more: the intake copies each row's two IRIs into its batch and maps them on the pool through the text index. - *Cold load:* 1.03 / 0.77 s privately, 1.06 / 0.79 s into the shared cache. - *Lookups:* `neighbours` of one IRI 0.1 / 0.1 ms (median of 20 calls), `most_similar` 1.1 / 1.0 ms, `similarity` of 100,000 pairs 1.31 / 0.41 s (past 65,536 lookups, so through a per-call index, which costs 40 MB at 5M nodes). - *Traversal:* `bfs` to depth 6 (1.07M rows) 0.95 / 0.49 s, `reachable_set` (5.0M rows) 3.72 / 2.22 s. Every row's `text` datum is built and checked against the encoding, so row emission, already most of these calls' time (above), about doubles. The kernels that return no ids are unchanged: `components` 2.77 / 2.74 s, `eigen` for 200 steps 75.9 / 77.3 s, and the library within noise (`clustering` 27.0 / 28.8 s, betweenness 40.5 / 40.1 s, `minimum_spanning_forest` 22.5 / 22.0 s). -- *Peaks:* the stages that read the version peak about 0.12 GB higher privately, the difference in the versions' sizes (`pagerank` 1.28 / 1.16 GB, `eigen` 2.28 / 2.17 GB). The calls that return a row per node peak higher still: `components` 1.28 / 0.80 GB and `minimum_spanning_forest` 1.77 / 0.98 GB, for their rows of text ids. Not investigated. +- *Peaks:* the stages that read the version peak about 0.12 GB higher privately, the difference in the versions' sizes (`pagerank` 1.28 / 1.16 GB, `eigen` 2.28 / 2.17 GB). The calls that return a row per node peak higher still: `components` 1.28 / 0.80 GB and `minimum_spanning_forest` 1.77 / 0.98 GB, for their rows of text ids (explained at full scale, below). - *Shared cache:* the shared version is 719.5 / 600.6 MB, and the private peaks fall by the version, as for `bigint` ids: `pagerank` 0.56 / 0.56 GB, `bfs` 0.12 / 0.12 GB, `components` 0.56 / 0.20 GB. Every §12 target that ran was met at this scale except `reachable_set`, which misses for both id types (12–13 / 22–23M edges/s). +*At full scale* (10M nodes, 100M edges; `bench/results/soak/a-text-m10.json` and `a-m10.json`): case a with every stage, the recursive CTE baseline, the second version (`diff`, `distance`), the library and both community detections included, a release build of 7934941 on the soak's machine and settings, text then `bigint` back to back with no other agent building (load average 1.0–1.5, the soak's own). Neither run came within `--disk-floor` (3 GiB, of about 20 GB free). Figures are text / `bigint`; peaks are private RssAnon: + +| Stage | Text | `bigint` | Text / `bigint` | +|---|---|---|---| +| Version (stored / cached) | 1.44 / 1.44 GB | 1.12 / 1.20 GB | 1.28 / 1.20 | +| `refresh` from the table | 110.2 s, 1.80 GB (VmHWM 2.96) | 79.1 s, 1.55 GB (VmHWM 2.71) | 1.39 time | +| `refresh` from the generator | 132.6 s, 1.87 GB | 99.1 s, 1.57 GB | 1.34 | +| Second `refresh` (0.1% fewer edges) | 115.6 s | 88.3 s | 1.31 | +| Cold load | 1.67 s (3,520 segment reads) | 1.27 s (2,208) | 1.32 | +| `neighbours` of one id | 0.06 ms | 0.06 ms | 1 | +| `bfs` depth 6 (1.47M rows) | 1.42 s, 1.58 GB | 0.66 s, 1.34 GB | 2.16 | +| Recursive CTE, depth 6 | 7.33 s | 6.89 s | `bfs` 5.2× / 10.5× faster | +| `reachable_set` (10.0M rows) | 7.49 s, 13.4M edges/s | 5.27 s, 19.0M edges/s | 1.42 | +| `components` | 10.58 s, 2.49 GB | 5.19 s, 1.54 GB | 2.04 | +| `pagerank`, 20 iterations (warm / cold) | 15.9 / 17.1 s, 2.50 GB | 12.8 / 14.4 s, 2.27 GB | 1.25 | +| `eigen`, 200 steps | 127.4 s, 4.55 GB | 114.4 s, 4.31 GB | 1.11 | +| `diff` / `distance` edit / degree | 21.0 / 0.83 / 0.50 s | 18.7 / 0.69 / 0.36 s | 1.12 | +| `eigenvector_centrality` / `katz_centrality` / `hits`, 20 iterations | 15.2 / 11.2 / 17.5 s | 12.4 / 8.0 / 14.2 s | 1.2–1.4 | +| `clustering` / `core_number` / `strong_components_vector` | 44.5 / 20.2 / 16.5 s | 41.8 / 19.0 / 16.3 s | 1.0–1.06 | +| `minimum_spanning_forest` (10.0M rows) | 51.9 s, 3.55 GB | 48.2 s, 1.92 GB | 1.08 time, 1.85 peak | +| betweenness / closeness / harmonic, `k := 16` | 58.9 / 5.5 / 5.4 s | 56.5 / 5.4 / 5.3 s | 1.0–1.04 | +| `most_similar` / `similarity` of 100,000 pairs / `similar_pairs` | 1 ms / 2.15 s / 10.4 s | 1 ms / 0.47 s / 9.7 s | `similarity` 4.6 | +| `louvain` | 544.6 s, 6.66 GB, modularity 0.1209, 5 levels, 16 communities | 528.2 s, 6.42 GB, 0.1209, 5 levels, 17 communities | 1.03 | +| `leiden` | 811.8 s, 8.43 GB, modularity 0.1871, 16 levels, 16 communities | 803.7 s, 8.10 GB, 0.1864, 16 levels, 15 communities | 1.01 | + +- *Size and build.* The text version is 28% larger, its id map the IRIs' bytes plus offsets and order; cached, 20% larger, since it builds no dense-id direction when it loads. The build costs 31–39% more (the half-scale 35%) and peaks 0.25 GB higher, the larger id map it holds. Every stage that reads the version peaks about 0.24 GB higher, the difference in the versions' cached sizes. +- *Where text costs.* Calls that emit a row per reached node pay for each id's `text` datum (built and checked against the encoding): `bfs` and `components` take twice as long, `reachable_set` 42% longer. `similarity`'s 100,000 pairs pass 65,536 lookups, so it builds its per-call index (80 MB at 10M nodes, the 8 bytes a node of §5.7) and maps each pair through it, 1.7 s more. Kernels that map no ids are within 12% (`pagerank`, `eigen`) or unchanged (the library, the community detections, which return a modularity). +- *Why `components` and `minimum_spanning_forest` peak higher.* Both build all their rows before they return the first: a `Vec` of `(AnyElement, …)` whose text datums are each `palloc`ed (`cstring_to_text_with_len`) in the set-returning function's multi-call memory context, which lives until the call ends. An IRI here is 33–36 bytes and its 4-byte varlena header, so AllocSet rounds it to a 64-byte chunk plus its 8-byte header: 72 bytes an id. Measured past each call's starting RssAnon, `components` holds 1,031 / 314 MB (717 MB more for 10M ids: 72 bytes each) and `minimum_spanning_forest` 2,030 / 646 MB (1,384 MB more for 20.0M ids: 69 bytes each); at half scale 78 and 68 bytes. With `bigint` ids the datum is by value and only the `Vec` is held (24 and 40 bytes a row). *The fix* (not built here): return the rows lazily, a `TableIterator` over the kernel's result (the labels, 4 bytes a node, or the forest's edges) and the loaded version, which makes each row's external ids in `next()`. pgrx calls `next()` after the first row in the caller's memory context, which for a function in `FROM` is the per-tuple context that `ExecMakeTableFunctionResult` resets before each call, and the row is then copied into the tuplestore (bounded by `work_mem`, then spilled). The datums would then live one row each, and no `Vec` of rows would be held: here the text peaks would fall by about 1.0 and 1.8 GB (the datums and the `Vec`) and the `bigint` ones by about 0.24 and 0.40 GB (the `Vec`), which leaves the kernel's result (4 bytes a node, or 16 bytes a forest edge). Other functions that build every row up front before they return one could be made lazy the same way. +- *Disk.* The community detections wrote, text / `bigint`: `louvain` 4.31 / 4.64 GB of segments and 6.14 / 6.14 GB of WAL, `leiden` 9.51 / 13.10 GB and 15.09 / 15.06 GB (the harness drops the edge table and the first version first), within the disk. + +At full scale every §12 target was met for both id types except `reachable_set` (13 / 19M edges/s, against 50M) and `bfs` against the recursive CTE (5.2 / 10.5×, against 20×); `components` (10.6 s) also misses its 10 s target with text ids only, which the lazy rows above would not change (it is time, not memory: the datums are built either way). + **Parallel query (M9, §5.6 step 9, §14 item 33; `bench/parallel.py`, `bench/results/parallel/`).** A probe table of node pairs (half an edge's endpoints, half random), `SELECT count(*) FROM probe WHERE warren.has_edge('g1', src, dst)`, `sum(warren.degree('g1', src))` and `count(*)` over `LATERAL warren.neighbours('g1', src)`, under `EXPLAIN (ANALYZE, TIMING OFF)` in a session whose leader has already read the graph, with the graph reads `PARALLEL RESTRICTED` (0.4.0's label) and `PARALLEL SAFE` (set by `ALTER FUNCTION` on the same library, a release build of cf9dce1), on PG 16.15 preloaded (the shared cache) and without the preload (every backend and worker loads privately), on the soak's machine (4 vCPUs). With workers, the planner's parallel costs are set to 0 ("forced"); "planned" is the planner's own choice at its default costs and `max_parallel_workers_per_gather = 4`. Medians of three runs (two at full scale), ms: | Case a, probe rows, read | Restricted, any | Safe, 0 workers | Safe, 2 forced | Safe, 4 forced | Safe, planned | diff --git a/bench/results/soak/README.md b/bench/results/soak/README.md index 89d4e54a..598947cf 100644 --- a/bench/results/soak/README.md +++ b/bench/results/soak/README.md @@ -374,3 +374,21 @@ Half scale, without the recursive CTE baseline, because the machine had about 8 GB of disk free, shared with other work; the full-scale text run needs about 16 GB (DESIGN.md §12). Both private runs skipped their second version for the disk floor, so `diff` and `distance` were not run. + +## Text node ids at full scale (M10 step 4, §5.7) + +`a-text-m10.json` then `a-m10.json`: case a at full scale (10M nodes, +100M edges) with IRIs and with `bigint` ids, every stage included (the +recursive CTE baseline, the second version with `diff` and `distance`, +the library and both community detections). PostgreSQL 16.15 from a +private tree, a release build of 7934941 (`pg_warren.so` sha256 +a935ebf8…), harness 7934941 (clean), the same 4-vCPU Xeon, one after the +other on 2026-10-23 with no other agent building: load average 1.0–1.5 +at each run's start and end, the soak's own. About 20 GB of disk was +free at the start, and neither run came within the floor. + + bench/soak.py a --ids text --label=-m10 --no-eigen-steps --eigen-max-iter 200 \ + --disk-floor 3221225472 \ + --pg-config /var/tmp/m10-pgtree/usr/lib/postgresql/16/bin/pg_config --parent /var/tmp/m10-soak \ + --extension-revision 7934941 --extension-profile release --threads 4 --statement-timeout 20min + bench/soak.py a --ids bigint --label=-m10 … # otherwise as above diff --git a/bench/results/soak/a-m10.json b/bench/results/soak/a-m10.json new file mode 100644 index 00000000..1057143d --- /dev/null +++ b/bench/results/soak/a-m10.json @@ -0,0 +1,1206 @@ +{ + "provenance": { + "argv": [ + "bench/soak.py", + "a", + "--no-eigen-steps", + "--eigen-max-iter", + "200", + "--disk-floor", + "3221225472", + "--pg-config", + "/var/tmp/m10-pgtree/usr/lib/postgresql/16/bin/pg_config", + "--parent", + "/var/tmp/m10-soak", + "--results", + "/var/tmp/m10-soak/results", + "--extension-revision", + "7934941", + "--extension-profile", + "release", + "--threads", + "4", + "--statement-timeout", + "20min", + "--label=-m10", + "--ids", + "bigint" + ], + "harness": { + "revision": "79349419e7b2be122e7e1f45779f771243399c71", + "dirty": false + }, + "extension": { + "revision": "7934941", + "profile": "release", + "library": "/var/tmp/m10-pgtree/usr/lib/postgresql/16/lib/pg_warren.so", + "library_sha256": "a935ebf833dcbd0f8a2b232ae83ba520468526c88c28ebffdd61aab8c70910cc" + } + }, + "case": "a", + "nodes": 10000000, + "edges": 100000000, + "weighted": false, + "ids": "bigint", + "relations": 1, + "store_merged": true, + "threads": 4, + "node_order": "id", + "eigen_max_iter": 200, + "statement_timeout": "20min", + "skip": [], + "planned_stages": [ + "bfs_cte", + "cold_load_probe", + "communities: leiden", + "communities: louvain", + "default: bfs depth 6", + "default: components", + "default: eigen", + "default: pagerank", + "default: prewarm", + "default: reachable_set", + "diff", + "library: betweenness_centrality", + "library: closeness_centrality", + "library: clustering", + "library: core_number", + "library: eigenvector_centrality", + "library: harmonic_centrality", + "library: hits", + "library: katz_centrality", + "library: minimum_spanning_forest", + "library: most_similar", + "library: similar_pairs", + "library: similarity", + "library: strong_components_vector", + "refresh" + ], + "hardware": { + "cpus": 4, + "model": "Intel(R) Xeon(R) Processor", + "memory_bytes": 16872804352, + "kernel": "6.18.44-fc-v153", + "load_average": [ + 1.3603515625, + 1.4384765625, + 1.52392578125 + ] + }, + "started_at": "2026-10-23T23:03:56+00:00", + "stages": { + "table 0: create": { + "sql": "CREATE UNLOGGED TABLE soak_removed ()", + "seconds": [ + 0.0004 + ], + "median_seconds": 0.0004, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 5566464, + "peak_rss_anon": 5566464, + "vm_hwm": 34856960, + "rss_anon_after": 5566464, + "rss_shmem_after": 15233024 + }, + "table 1: create": { + "sql": "CREATE UNLOGGED TABLE soak_edges (src int4 NOT NULL, dst int4 NOT NULL) WITH (autovacuum_enabled = false)", + "seconds": [ + 0.0005 + ], + "median_seconds": 0.0005, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 5566464, + "peak_rss_anon": 5566464, + "vm_hwm": 34861056, + "rss_anon_after": 5566464, + "rss_shmem_after": 15237120 + }, + "table 2: insert": { + "sql": "INSERT INTO soak_edges SELECT 1 + floor(random() * 10000000)::int4 AS src, 1 + floor(random() * 10000000)::int4 AS dst FROM (SELECT setseed(0.25) OFFSET 0) seeded CROSS JOIN generate_series(1, 100000000)", + "seconds": [ + 32.9168 + ], + "median_seconds": 32.9168, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 5566464, + "peak_rss_anon": 95428608, + "vm_hwm": 1252122624, + "rss_anon_after": 32481280, + "rss_shmem_after": 1095958528 + }, + "table 3: analyze": { + "sql": "ANALYZE soak_edges", + "seconds": [ + 0.242 + ], + "median_seconds": 0.242, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 32481280, + "peak_rss_anon": 32485376, + "vm_hwm": 1189990400, + "rss_anon_after": 32485376, + "rss_shmem_after": 1095958528 + }, + "cte: index": { + "sql": "CREATE INDEX soak_edges_src ON soak_edges (src)", + "seconds": [ + 27.1156 + ], + "median_seconds": 27.1156, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 32489472, + "peak_rss_anon": 1101139968, + "vm_hwm": 2258169856, + "rss_anon_after": 27439104, + "rss_shmem_after": 1095995392 + }, + "bfs_cte": { + "sql": "SELECT bench_seconds($soak$WITH RECURSIVE r (id, depth) AS (SELECT 1::int4, 0 UNION SELECT e.dst, r.depth + 1 FROM r JOIN soak_edges e ON e.src = r.id WHERE r.depth < 6) SELECT count(DISTINCT id) FROM r$soak$)", + "seconds": [ + 6.8929 + ], + "median_seconds": 6.8929, + "rows": [ + "6.890652" + ], + "first_rows": [ + "6.890652" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 27439104, + "peak_rss_anon": 324001792, + "vm_hwm": 1481003008, + "rss_anon_after": 68272128, + "rss_shmem_after": 1096048640, + "server_seconds": [ + 6.890652 + ], + "server_median_seconds": 6.890652 + }, + "bfs_cte count": { + "sql": "WITH RECURSIVE r (id, depth) AS (SELECT 1::int4, 0 UNION SELECT e.dst, r.depth + 1 FROM r JOIN soak_edges e ON e.src = r.id WHERE r.depth < 6) SELECT count(DISTINCT id) FROM r", + "seconds": [ + 6.3655 + ], + "median_seconds": 6.3655, + "rows": [ + "1468608" + ], + "first_rows": [ + "1468608" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 68272128, + "peak_rss_anon": 321728512, + "vm_hwm": 1478651904, + "rss_anon_after": 68272128, + "rss_shmem_after": 1096052736 + }, + "create_graph": { + "sql": "SELECT warren.create_graph('soak', $n$SELECT id FROM generate_series(1::bigint, 10000000) id$n$, $q$SELECT src::bigint, dst::bigint FROM soak_edges$q$, weighted := false, has_relations := false, store_merged := true, node_order := 'id')", + "seconds": [ + 0.017 + ], + "median_seconds": 0.017, + "rows": [ + "" + ], + "first_rows": [ + "" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3207168, + "peak_rss_anon": 9715712, + "vm_hwm": 73981952, + "rss_anon_after": 9715712, + "rss_shmem_after": 11780096 + }, + "refresh": { + "sql": "SELECT warren.refresh('soak')", + "seconds": [ + 79.1483 + ], + "median_seconds": 79.1483, + "rows": [ + "1" + ], + "first_rows": [ + "1" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 9715712, + "peak_rss_anon": 1551654912, + "vm_hwm": 2707070976, + "rss_anon_after": 40218624, + "rss_shmem_after": 1112186880 + }, + "refresh from the generator": { + "sql": "SELECT warren.refresh('soak_generated')", + "seconds": [ + 99.0959 + ], + "median_seconds": 99.0959, + "rows": [ + "2" + ], + "first_rows": [ + "2" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 9822208, + "peak_rss_anon": 1572409344, + "vm_hwm": 1878216704, + "rss_anon_after": 40398848, + "rss_shmem_after": 1110822912 + }, + "cold_load_probe": { + "sql": "SELECT warren.prewarm('soak')", + "seconds": [ + 1.6407 + ], + "median_seconds": 1.6407, + "rows": [ + "1" + ], + "first_rows": [ + "1" + ], + "notices": [ + "NOTICE: version 1 (1201249756 bytes) cannot be kept within warren.max_cache_memory (65536 bytes, 0 of them held by transient vectors), so it is held only until the statement ends, the bytes past the cap charged to warren.max_compute_memory, and reloaded by each statement that reads it; raise warren.max_cache_memory" + ], + "warnings": [], + "rss_anon_before": 3211264, + "peak_rss_anon": 1213521920, + "vm_hwm": 2312667136, + "rss_anon_after": 12267520, + "rss_shmem_after": 1082544128 + }, + "default: prewarm": { + "sql": "WITH before AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND 1 IS NOT NULL) AS reads), run AS MATERIALIZED (SELECT warren.prewarm('soak') AS result FROM before WHERE before.reads IS NOT NULL), after AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND run.result IS NOT NULL) AS reads FROM run) SELECT after.reads - before.reads, run.result FROM before, run, after", + "seconds": [ + 1.2679 + ], + "median_seconds": 1.2679, + "rows": [ + "2208|1" + ], + "first_rows": [ + "2208|1" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3207168, + "peak_rss_anon": 1213853696, + "vm_hwm": 2321825792, + "rss_anon_after": 1213833216, + "rss_shmem_after": 1091301376 + }, + "default: bfs depth 6": { + "sql": "SELECT bench_seconds($soak$SELECT count(*) FROM warren.bfs('soak', ARRAY[1::bigint], 6)$soak$)", + "seconds": [ + 0.655, + 0.675, + 0.6592 + ], + "median_seconds": 0.6592, + "rows": [ + "0.658199" + ], + "first_rows": [ + "0.654127", + "0.674439", + "0.658199" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1213923328, + "peak_rss_anon": 1343152128, + "vm_hwm": 2452152320, + "rss_anon_after": 1217253376, + "rss_shmem_after": 1091301376, + "server_seconds": [ + 0.654127, + 0.674439, + 0.658199 + ], + "server_median_seconds": 0.658199 + }, + "default: bfs depth 6 count": { + "sql": "SELECT count(*) FROM warren.bfs('soak', ARRAY[1::bigint], 6)", + "seconds": [ + 0.6876 + ], + "median_seconds": 0.6876, + "rows": [ + "1468608" + ], + "first_rows": [ + "1468608" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1217253376, + "peak_rss_anon": 1343164416, + "vm_hwm": 2452119552, + "rss_anon_after": 1217261568, + "rss_shmem_after": 1091301376 + }, + "default: neighbours": { + "sql": "SELECT bench_seconds($soak$SELECT count(*) FROM warren.neighbours('soak', 1::bigint)$soak$)", + "seconds": [ + 0.001, + 0.0003, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0001, + 0.0002, + 0.0002, + 0.0002, + 0.0001, + 0.0001, + 0.0002 + ], + "median_seconds": 0.0002, + "rows": [ + "6.3e-05" + ], + "first_rows": [ + "0.000552", + "0.000113", + "7.1e-05", + "6.8e-05", + "7.2e-05", + "7.9e-05", + "5.9e-05", + "6.2e-05", + "6.2e-05", + "6.2e-05", + "6e-05", + "6.7e-05", + "6e-05", + "5.6e-05", + "0.000107", + "6.9e-05", + "6.6e-05", + "5.7e-05", + "5.5e-05", + "6.3e-05" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1217261568, + "peak_rss_anon": 1217282048, + "vm_hwm": 2326654976, + "rss_anon_after": 1217282048, + "rss_shmem_after": 1091301376, + "server_seconds": [ + 0.000552, + 0.000113, + 7.1e-05, + 6.8e-05, + 7.2e-05, + 7.9e-05, + 5.9e-05, + 6.2e-05, + 6.2e-05, + 6.2e-05, + 6e-05, + 6.7e-05, + 6e-05, + 5.6e-05, + 0.000107, + 6.9e-05, + 6.6e-05, + 5.7e-05, + 5.5e-05, + 6.3e-05 + ], + "server_median_seconds": 6.45e-05 + }, + "default: reachable_set": { + "sql": "SELECT count(*) FROM warren.reachable_set('soak', ARRAY[1::bigint])", + "seconds": [ + 5.2666 + ], + "median_seconds": 5.2666, + "rows": [ + "9999584" + ], + "first_rows": [ + "9999584" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1217282048, + "peak_rss_anon": 1650528256, + "vm_hwm": 2761863168, + "rss_anon_after": 1229090816, + "rss_shmem_after": 1091301376 + }, + "default: reachable_set stats": { + "stats": [ + "{\"graph\": \"soak\", \"version\": 1, \"function\": \"reachable_set\", \"truncated\": false, \"nodes_visited\": 9999584, \"edges_traversed\": 17885683}" + ] + }, + "default: components": { + "sql": "SELECT count(*) FROM (SELECT component_id FROM warren.components('soak', NULL::bigint) GROUP BY 1) c", + "seconds": [ + 5.1933 + ], + "median_seconds": 5.1933, + "rows": [ + "1" + ], + "first_rows": [ + "1" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1229094912, + "peak_rss_anon": 1542967296, + "vm_hwm": 2658398208, + "rss_anon_after": 1227845632, + "rss_shmem_after": 1091301376 + }, + "default: pagerank": { + "sql": "WITH before AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND 1 IS NOT NULL) AS reads), run AS MATERIALIZED (SELECT warren.pagerank('soak', 'pr', tol := 0, max_iter := 20) AS result FROM before WHERE before.reads IS NOT NULL), after AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND run.result IS NOT NULL) AS reads FROM run) SELECT after.reads - before.reads, run.result FROM before, run, after", + "seconds": [ + 12.7957 + ], + "median_seconds": 12.7957, + "rows": [ + "0|20" + ], + "first_rows": [ + "0|20" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1227845632, + "peak_rss_anon": 2273587200, + "vm_hwm": 3401236480, + "rss_anon_after": 1293107200, + "rss_shmem_after": 1108463616 + }, + "default: pagerank from cold": { + "sql": "WITH before AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND 1 IS NOT NULL) AS reads), run AS MATERIALIZED (SELECT warren.pagerank('soak', 'pr', tol := 0, max_iter := 20) AS result FROM before WHERE before.reads IS NOT NULL), after AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND run.result IS NOT NULL) AS reads FROM run) SELECT after.reads - before.reads, run.result FROM before, run, after", + "seconds": [ + 14.4025 + ], + "median_seconds": 14.4025, + "rows": [ + "2208|20" + ], + "first_rows": [ + "2208|20" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 11857920, + "peak_rss_anon": 2265923584, + "vm_hwm": 3395579904, + "rss_anon_after": 1309904896, + "rss_shmem_after": 1110577152 + }, + "default: eigen": { + "sql": "SELECT count(*), max(residual) FROM warren.eigen('soak', 20, 'normalized_laplacian', 'smallest', tol := 1e-06, max_iter := 200)", + "seconds": [ + 114.4134 + ], + "median_seconds": 114.4134, + "rows": [ + "20|0.005385798079678662" + ], + "first_rows": [ + "20|0.005385798079678662" + ], + "notices": [], + "warnings": [ + "WARNING: eigen did not converge in 200 steps; the largest residual is 5.385798079678662e-3 (raise max_iter or tol)" + ], + "rss_anon_before": 1309904896, + "peak_rss_anon": 4310409216, + "vm_hwm": 5440638976, + "rss_anon_after": 1309954048, + "rss_shmem_after": 1110577152 + }, + "refresh 2": { + "sql": "SELECT warren.refresh('soak')", + "seconds": [ + 88.2713 + ], + "median_seconds": 88.2713, + "rows": [ + "3" + ], + "first_rows": [ + "3" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3207168, + "peak_rss_anon": 1555587072, + "vm_hwm": 2027102208, + "rss_anon_after": 40128512, + "rss_shmem_after": 1110806528 + }, + "diff": { + "sql": "SELECT warren.diff('soak', 1, 3)", + "seconds": [ + 18.7179 + ], + "median_seconds": 18.7179, + "rows": [ + "{\"to\": 3, \"from\": 1, \"nodes\": {\"added\": 0, \"after\": 10000000, \"before\": 10000000, \"removed\": 0}, \"in_degree\": {\"histogram\": [{\"after\": 421, \"before\": 416, \"degree\": 0}, {\"after\": 4591, \"before\": 4548, \"degree\": 1}, {\"after\": 22931, \"before\": 22749, \"degree\": 2}, {\"after\": 76262, \"before\": 75774, \"degree\": 3}, {\"after\": 190273, \"before\": 189073, \"degree\": 4}, {\"after\": 379665, \"before\": 377767, \"degree\": 5}, {\"after\": 633101, \"before\": 630554, \"degree\": 6}, {\"after\": 903167, \"before\": 900511, \"degree\": 7}, {\"after\": 1128686, \"before\": 1126494, \"degree\": 8}, {\"after\": 1252173, \"before\": 1250680, \"degree\": 9}, {\"after\": 1250935, \"before\": 1250962, \"degree\": 10}, {\"after\": 1137104, \"before\": 1138440, \"degree\": 11}, {\"after\": 946746, \"before\": 948581, \"degree\": 12}, {\"after\": 727241, \"before\": 729533, \"degree\": 13}, {\"after\": 517925, \"before\": 519997, \"degree\": 14}, {\"after\": 344843, \"before\": 346592, \"degree\": 15}, {\"after\": 215787, \"before\": 217120, \"degree\": 16}, {\"after\": 126739, \"before\": 127575, \"degree\": 17}, {\"after\": 70189, \"before\": 70703, \"degree\": 18}, {\"after\": 37024, \"before\": 37346, \"degree\": 19}, {\"after\": 18621, \"before\": 18846, \"degree\": 20}, {\"after\": 8677, \"before\": 8750, \"degree\": 21}, {\"after\": 3991, \"before\": 4033, \"degree\": 22}, {\"after\": 1732, \"before\": 1759, \"degree\": 23}, {\"after\": 688, \"before\": 704, \"degree\": 24}, {\"after\": 312, \"before\": 313, \"degree\": 25}, {\"after\": 114, \"before\": 117, \"degree\": 26}, {\"after\": 35, \"before\": 36, \"degree\": 27}, {\"after\": 16, \"before\": 16, \"degree\": 28}, {\"after\": 6, \"before\": 6, \"degree\": 29}, {\"after\": 3, \"before\": 3, \"degree\": 30}, {\"after\": 1, \"before\": 1, \"degree\": 31}, {\"after\": 1, \"before\": 1, \"degree\": 32}], \"mean_after\": 9.9899934, \"mean_before\": 9.9999953, \"ks_statistic\": 0.0012704}, \"relations\": [{\"added\": 0, \"after\": 99899934, \"before\": 99999953, \"removed\": 100019, \"relation\": \"\"}], \"out_degree\": {\"histogram\": [{\"after\": 10469, \"before\": 469, \"degree\": 0}, {\"after\": 4551, \"before\": 4555, \"degree\": 1}, {\"after\": 22606, \"before\": 22622, \"degree\": 2}, {\"after\": 75539, \"before\": 75613, \"degree\": 3}, {\"after\": 188455, \"before\": 188644, \"degree\": 4}, {\"after\": 378122, \"before\": 378498, \"degree\": 5}, {\"after\": 630702, \"before\": 631364, \"degree\": 6}, {\"after\": 900667, \"before\": 901545, \"degree\": 7}, {\"after\": 1125160, \"before\": 1126303, \"degree\": 8}, {\"after\": 1249551, \"before\": 1250805, \"degree\": 9}, {\"after\": 1249562, \"before\": 1250853, \"degree\": 10}, {\"after\": 1134308, \"before\": 1135417, \"degree\": 11}, {\"after\": 946861, \"before\": 947792, \"degree\": 12}, {\"after\": 728396, \"before\": 729136, \"degree\": 13}, {\"after\": 520328, \"before\": 520792, \"degree\": 14}, {\"after\": 347515, \"before\": 347853, \"degree\": 15}, {\"after\": 217088, \"before\": 217331, \"degree\": 16}, {\"after\": 127520, \"before\": 127646, \"degree\": 17}, {\"after\": 71067, \"before\": 71144, \"degree\": 18}, {\"after\": 37270, \"before\": 37313, \"degree\": 19}, {\"after\": 18523, \"before\": 18541, \"degree\": 20}, {\"after\": 8798, \"before\": 8810, \"degree\": 21}, {\"after\": 4115, \"before\": 4126, \"degree\": 22}, {\"after\": 1689, \"before\": 1690, \"degree\": 23}, {\"after\": 713, \"before\": 713, \"degree\": 24}, {\"after\": 253, \"before\": 253, \"degree\": 25}, {\"after\": 98, \"before\": 98, \"degree\": 26}, {\"after\": 46, \"before\": 46, \"degree\": 27}, {\"after\": 20, \"before\": 20, \"degree\": 28}, {\"after\": 7, \"before\": 7, \"degree\": 29}, {\"after\": 1, \"before\": 1, \"degree\": 30}], \"mean_after\": 9.9899934, \"mean_before\": 9.9999953, \"ks_statistic\": 0.001}, \"all_relations\": {\"added\": 0, \"after\": 99899934, \"before\": 99999953, \"removed\": 100019}}" + ], + "first_rows": [ + "{\"to\": 3, \"from\": 1, \"nodes\": {\"added\": 0, \"after\": 10000000, \"before\": 10000000, \"removed\": 0}, \"in_degree\": {\"histogram\": [{\"after\": 421, \"before\": 416, \"degree\": 0}, {\"after\": 4591, \"before\": 4548, \"degree\": 1}, {\"after\": 22931, \"before\": 22749, \"degree\": 2}, {\"after\": 76262, \"before\": 75774, \"degree\": 3}, {\"after\": 190273, \"before\": 189073, \"degree\": 4}, {\"after\": 379665, \"before\": 377767, \"degree\": 5}, {\"after\": 633101, \"before\": 630554, \"degree\": 6}, {\"after\": 903167, \"before\": 900511, \"degree\": 7}, {\"after\": 1128686, \"before\": 1126494, \"degree\": 8}, {\"after\": 1252173, \"before\": 1250680, \"degree\": 9}, {\"after\": 1250935, \"before\": 1250962, \"degree\": 10}, {\"after\": 1137104, \"before\": 1138440, \"degree\": 11}, {\"after\": 946746, \"before\": 948581, \"degree\": 12}, {\"after\": 727241, \"before\": 729533, \"degree\": 13}, {\"after\": 517925, \"before\": 519997, \"degree\": 14}, {\"after\": 344843, \"before\": 346592, \"degree\": 15}, {\"after\": 215787, \"before\": 217120, \"degree\": 16}, {\"after\": 126739, \"before\": 127575, \"degree\": 17}, {\"after\": 70189, \"before\": 70703, \"degree\": 18}, {\"after\": 37024, \"before\": 37346, \"degree\": 19}, {\"after\": 18621, \"before\": 18846, \"degree\": 20}, {\"after\": 8677, \"before\": 8750, \"degree\": 21}, {\"after\": 3991, \"before\": 4033, \"degree\": 22}, {\"after\": 1732, \"before\": 1759, \"degree\": 23}, {\"after\": 688, \"before\": 704, \"degree\": 24}, {\"after\": 312, \"before\": 313, \"degree\": 25}, {\"after\": 114, \"before\": 117, \"degree\": 26}, {\"after\": 35, \"before\": 36, \"degree\": 27}, {\"after\": 16, \"before\": 16, \"degree\": 28}, {\"after\": 6, \"before\": 6, \"degree\": 29}, {\"after\": 3, \"before\": 3, \"degree\": 30}, {\"after\": 1, \"before\": 1, \"degree\": 31}, {\"after\": 1, \"before\": 1, \"degree\": 32}], \"mean_after\": 9.9899934, \"mean_before\": 9.9999953, \"ks_statistic\": 0.0012704}, \"relations\": [{\"added\": 0, \"after\": 99899934, \"before\": 99999953, \"removed\": 100019, \"relation\": \"\"}], \"out_degree\": {\"histogram\": [{\"after\": 10469, \"before\": 469, \"degree\": 0}, {\"after\": 4551, \"before\": 4555, \"degree\": 1}, {\"after\": 22606, \"before\": 22622, \"degree\": 2}, {\"after\": 75539, \"before\": 75613, \"degree\": 3}, {\"after\": 188455, \"before\": 188644, \"degree\": 4}, {\"after\": 378122, \"before\": 378498, \"degree\": 5}, {\"after\": 630702, \"before\": 631364, \"degree\": 6}, {\"after\": 900667, \"before\": 901545, \"degree\": 7}, {\"after\": 1125160, \"before\": 1126303, \"degree\": 8}, {\"after\": 1249551, \"before\": 1250805, \"degree\": 9}, {\"after\": 1249562, \"before\": 1250853, \"degree\": 10}, {\"after\": 1134308, \"before\": 1135417, \"degree\": 11}, {\"after\": 946861, \"before\": 947792, \"degree\": 12}, {\"after\": 728396, \"before\": 729136, \"degree\": 13}, {\"after\": 520328, \"before\": 520792, \"degree\": 14}, {\"after\": 347515, \"before\": 347853, \"degree\": 15}, {\"after\": 217088, \"before\": 217331, \"degree\": 16}, {\"after\": 127520, \"before\": 127646, \"degree\": 17}, {\"after\": 71067, \"before\": 71144, \"degree\": 18}, {\"after\": 37270, \"before\": 37313, \"degree\": 19}, {\"after\": 18523, \"before\": 18541, \"degree\": 20}, {\"after\": 8798, \"before\": 8810, \"degree\": 21}, {\"after\": 4115, \"before\": 4126, \"degree\": 22}, {\"after\": 1689, \"before\": 1690, \"degree\": 23}, {\"after\": 713, \"before\": 713, \"degree\": 24}, {\"after\": 253, \"before\": 253, \"degree\": 25}, {\"after\": 98, \"before\": 98, \"degree\": 26}, {\"after\": 46, \"before\": 46, \"degree\": 27}, {\"after\": 20, \"before\": 20, \"degree\": 28}, {\"after\": 7, \"before\": 7, \"degree\": 29}, {\"after\": 1, \"before\": 1, \"degree\": 30}], \"mean_after\": 9.9899934, \"mean_before\": 9.9999953, \"ks_statistic\": 0.001}, \"all_relations\": {\"added\": 0, \"after\": 99899934, \"before\": 99999953, \"removed\": 100019}}" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3207168, + "peak_rss_anon": 2494038016, + "vm_hwm": 3604631552, + "rss_anon_after": 2414043136, + "rss_shmem_after": 1093627904 + }, + "distance edit": { + "sql": "SELECT warren.distance('soak', 1, 3, 'edit')", + "seconds": [ + 0.6854 + ], + "median_seconds": 0.6854, + "rows": [ + "{\"to\": 3, \"from\": 1, \"method\": \"edit\", \"overall\": {\"added\": 0, \"union\": 99999953, \"removed\": 100019, \"distance\": 0.0010001904700895209}, \"relations\": [{\"added\": 0, \"union\": 99999953, \"removed\": 100019, \"distance\": 0.0010001904700895209, \"relation\": \"\"}]}" + ], + "first_rows": [ + "{\"to\": 3, \"from\": 1, \"method\": \"edit\", \"overall\": {\"added\": 0, \"union\": 99999953, \"removed\": 100019, \"distance\": 0.0010001904700895209}, \"relations\": [{\"added\": 0, \"union\": 99999953, \"removed\": 100019, \"distance\": 0.0010001904700895209, \"relation\": \"\"}]}" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 2414043136, + "peak_rss_anon": 2414075904, + "vm_hwm": 3525124096, + "rss_anon_after": 2414075904, + "rss_shmem_after": 1093627904 + }, + "distance degree": { + "sql": "SELECT warren.distance('soak', 1, 3, 'degree')", + "seconds": [ + 0.3593 + ], + "median_seconds": 0.3593, + "rows": [ + "{\"ks\": 0.001, \"to\": 3, \"from\": 1, \"method\": \"degree\", \"wasserstein\": 0.0100018999999998}" + ], + "first_rows": [ + "{\"ks\": 0.001, \"to\": 3, \"from\": 1, \"method\": \"degree\", \"wasserstein\": 0.0100018999999998}" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 2414075904, + "peak_rss_anon": 2414161920, + "vm_hwm": 3525210112, + "rss_anon_after": 2414161920, + "rss_shmem_after": 1093627904 + }, + "library: eigenvector_centrality": { + "sql": "SELECT warren.eigenvector_centrality('soak', 'library', tol := 0, max_iter := 20)", + "seconds": [ + 12.3498 + ], + "median_seconds": 12.3498, + "rows": [ + "20" + ], + "first_rows": [ + "20" + ], + "notices": [], + "warnings": [ + "WARNING: eigenvector_centrality did not converge in 20 iterations" + ], + "rss_anon_before": 3207168, + "peak_rss_anon": 1784107008, + "vm_hwm": 2914013184, + "rss_anon_after": 1366831104, + "rss_shmem_after": 1111711744 + }, + "library: katz_centrality": { + "sql": "SELECT warren.katz_centrality('soak', 'library', alpha := 0.01, tol := 0, max_iter := 20)", + "seconds": [ + 8.0304 + ], + "median_seconds": 8.0304, + "rows": [ + "20" + ], + "first_rows": [ + "20" + ], + "notices": [], + "warnings": [ + "WARNING: katz_centrality did not converge in 20 iterations" + ], + "rss_anon_before": 1286840320, + "peak_rss_anon": 1951928320, + "vm_hwm": 3082043392, + "rss_anon_after": 1358483456, + "rss_shmem_after": 1111719936 + }, + "library: hits": { + "sql": "SELECT warren.hits('soak', 'library_hubs', 'library_authorities', tol := 0, max_iter := 20)", + "seconds": [ + 14.1572 + ], + "median_seconds": 14.1572, + "rows": [ + "20" + ], + "first_rows": [ + "20" + ], + "notices": [], + "warnings": [ + "WARNING: hits did not converge in 20 iterations" + ], + "rss_anon_before": 1278480384, + "peak_rss_anon": 1871953920, + "vm_hwm": 3002068992, + "rss_anon_after": 1438515200, + "rss_shmem_after": 1111719936 + }, + "library: clustering": { + "sql": "SELECT warren.clustering('soak', 'library')", + "seconds": [ + 41.828 + ], + "median_seconds": 41.828, + "rows": [ + "" + ], + "first_rows": [ + "" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1278509056, + "peak_rss_anon": 3036921856, + "vm_hwm": 4166955008, + "rss_anon_after": 1358548992, + "rss_shmem_after": 1111719936 + }, + "library: core_number": { + "sql": "SELECT warren.core_number('soak', 'library', persist := false)", + "seconds": [ + 18.9826 + ], + "median_seconds": 18.9826, + "rows": [ + "14" + ], + "first_rows": [ + "14" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1278545920, + "peak_rss_anon": 3196960768, + "vm_hwm": 4327014400, + "rss_anon_after": 1358548992, + "rss_shmem_after": 1111719936 + }, + "library: strong_components_vector": { + "sql": "SELECT warren.strong_components_vector('soak', 'library', persist := false)", + "seconds": [ + 16.3314 + ], + "median_seconds": 16.3314, + "rows": [ + "10894" + ], + "first_rows": [ + "10894" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1278545920, + "peak_rss_anon": 1651032064, + "vm_hwm": 2781417472, + "rss_anon_after": 1357635584, + "rss_shmem_after": 1111719936 + }, + "library: minimum_spanning_forest": { + "sql": "SELECT count(*) FROM warren.minimum_spanning_forest('soak', NULL::bigint)", + "seconds": [ + 48.1693 + ], + "median_seconds": 48.1693, + "rows": [ + "9999999" + ], + "first_rows": [ + "9999999" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1277632512, + "peak_rss_anon": 1923809280, + "vm_hwm": 3054354432, + "rss_anon_after": 1283801088, + "rss_shmem_after": 1111719936 + }, + "library: betweenness_centrality": { + "sql": "SELECT warren.betweenness_centrality('soak', 'library', k := 16, persist := false)", + "seconds": [ + 56.4697 + ], + "median_seconds": 56.4697, + "rows": [ + "16" + ], + "first_rows": [ + "16" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1283801088, + "peak_rss_anon": 2643841024, + "vm_hwm": 3774574592, + "rss_anon_after": 1363808256, + "rss_shmem_after": 1111719936 + }, + "library: closeness_centrality": { + "sql": "SELECT warren.closeness_centrality('soak', 'library', k := 16, persist := false)", + "seconds": [ + 5.4069 + ], + "median_seconds": 5.4069, + "rows": [ + "16" + ], + "first_rows": [ + "16" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1283805184, + "peak_rss_anon": 1923829760, + "vm_hwm": 3054587904, + "rss_anon_after": 1363873792, + "rss_shmem_after": 1111719936 + }, + "library: harmonic_centrality": { + "sql": "SELECT warren.harmonic_centrality('soak', 'library', k := 16, persist := false)", + "seconds": [ + 5.3309 + ], + "median_seconds": 5.3309, + "rows": [ + "16" + ], + "first_rows": [ + "16" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1283870720, + "peak_rss_anon": 1843892224, + "vm_hwm": 2974556160, + "rss_anon_after": 1363877888, + "rss_shmem_after": 1111719936 + }, + "library: most_similar": { + "sql": "SELECT count(*) FROM warren.most_similar('soak', 1::bigint)", + "seconds": [ + 0.0014 + ], + "median_seconds": 0.0014, + "rows": [ + "10" + ], + "first_rows": [ + "10" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1283874816, + "peak_rss_anon": 1283878912, + "vm_hwm": 2415292416, + "rss_anon_after": 1283878912, + "rss_shmem_after": 1111719936 + }, + "library: similarity": { + "sql": "SELECT count(*) FROM warren.similarity('soak', $p$SELECT (1 + (i * 7919) % 10000000)::bigint, (1 + (i * 104729) % 10000000)::bigint FROM generate_series(1::bigint, 100000) i$p$, NULL::bigint)", + "seconds": [ + 0.4679 + ], + "median_seconds": 0.4679, + "rows": [ + "100000" + ], + "first_rows": [ + "100000" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1283878912, + "peak_rss_anon": 1283891200, + "vm_hwm": 2415566848, + "rss_anon_after": 1283891200, + "rss_shmem_after": 1111719936 + }, + "library: similar_pairs": { + "sql": "SELECT count(*) FROM warren.similar_pairs('soak', NULL::bigint, nodes := 'library_mask')", + "seconds": [ + 9.6647 + ], + "median_seconds": 9.6647, + "rows": [ + "1000000" + ], + "first_rows": [ + "1000000" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1363902464, + "peak_rss_anon": 3581648896, + "vm_hwm": 4713172992, + "rss_anon_after": 1383477248, + "rss_shmem_after": 1111719936 + }, + "communities: louvain": { + "sql": "SELECT warren.louvain('soak', 'louvain', levels_prefix := 'louvain')", + "seconds": [ + 528.1848 + ], + "median_seconds": 528.1848, + "rows": [ + "0.12086016440899057" + ], + "first_rows": [ + "0.12086016440899057" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3362816, + "peak_rss_anon": 6419070976, + "vm_hwm": 7548604416, + "rss_anon_after": 1754963968, + "rss_shmem_after": 1111158784 + }, + "communities: louvain stats": { + "rows": [ + "5|17" + ] + }, + "communities: louvain disk": { + "segments_written": 4644298752, + "wal_written": 6135551168, + "free_disk_before": 16387137536, + "free_disk_after_run": 11742793728, + "free_disk_after_vacuum": 16747032576 + }, + "communities: leiden": { + "sql": "SELECT warren.leiden('soak', 'leiden', levels_prefix := 'leiden')", + "seconds": [ + 803.7114 + ], + "median_seconds": 803.7114, + "rows": [ + "0.18643843717637515" + ], + "first_rows": [ + "0.18643843717637515" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3362816, + "peak_rss_anon": 8100745216, + "vm_hwm": 9228546048, + "rss_anon_after": 2825990144, + "rss_shmem_after": 1112080384 + }, + "communities: leiden stats": { + "rows": [ + "16|15" + ] + }, + "communities: leiden disk": { + "segments_written": 13096304640, + "wal_written": 15060639352, + "free_disk_before": 16747032576, + "free_disk_after_run": 3650633728, + "free_disk_after_vacuum": 16606674944 + } + }, + "skipped": {}, + "pg_warren": "0.6.0", + "postgres": "16.15 (Ubuntu 16.15-0ubuntu0.24.04.1)", + "edge_table_bytes": 3625689088, + "version_1": { + "seq": 1, + "bytes": 1121249756, + "label": null, + "staged": false, + "current": true, + "vectors": 0, + "version": 1, + "built_at": "2026-10-23T23:05:10.164794+00:00", + "id_space": 10000000, + "built_lsn": "0/1CAE9A0", + "staleness": "00:02:59.849418", + "edge_count": 99999953, + "node_count": 10000000, + "label_vector": null, + "parent_graph": null, + "target_width": 4, + "dropped_edges": 0, + "compacted_from": null, + "parent_version": null, + "deduplicated_edges": 47 + }, + "cached_bytes": 1201249756, + "shared_bytes": 0, + "cache_memory_bytes": 4294967296, + "settings": { + "default": [ + "fsync=off", + "full_page_writes=off", + "jit=on", + "maintenance_work_mem=1GB", + "max_parallel_workers_per_gather=2", + "max_wal_size=1GB", + "shared_buffers=1GB", + "shared_preload_libraries=", + "statement_timeout=20min", + "synchronous_commit=off", + "wal_level=minimal", + "warren.max_build_memory=4GB", + "warren.max_cache_memory=4GB", + "warren.max_compute_memory=4GB", + "warren.shared_cache_memory=4GB", + "warren.threads=4", + "work_mem=64MB" + ] + }, + "version_2": { + "seq": 2, + "bytes": 1120449604, + "label": null, + "staged": false, + "current": true, + "vectors": 0, + "version": 3, + "built_at": "2026-10-23T23:10:51.193987+00:00", + "id_space": 10000000, + "built_lsn": "0/9F40CD90", + "staleness": "00:01:28.279528", + "edge_count": 99899934, + "node_count": 10000000, + "label_vector": null, + "parent_graph": null, + "target_width": 4, + "dropped_edges": 0, + "compacted_from": null, + "parent_version": null, + "deduplicated_edges": 47 + }, + "library_version": 3, + "finished_at": "2026-10-23T23:39:54+00:00", + "free_disk_after": 19152064512, + "load_average_after": [ + 1.15869140625, + 1.25, + 1.44189453125 + ], + "measured": { + "cores": 4, + "bfs_seconds": 0.658199, + "bfs_cte_seconds": 6.890652, + "components_seconds": 5.1933, + "pagerank_seconds": 12.7957, + "refresh_seconds": 79.1483, + "refresh_peak_bytes": 2707070976, + "diff_seconds": 18.7179, + "cold_load_seconds": 1.2679, + "load_segment_reads": 2208, + "pagerank_segment_reads": 0, + "pagerank_loads": 0.0, + "pagerank_cold_segment_reads": 2208, + "pagerank_cold_seconds": 14.4025, + "pagerank_cold_loads": 1.0, + "eigen_residual": 0.005385798079678662, + "eigen_converged": false, + "eigen_seconds_per_step": 0.572067, + "reachable_row_entries_per_second": 3396058.747579083, + "reachable_edges_per_second": 18987573.197129074, + "cached_bytes": 1201249756, + "id_space": 10000000, + "max_cache_memory": 4294967296, + "library": { + "eigenvector_centrality": { + "seconds": 12.3498, + "peak_rss_anon": 1784107008 + }, + "katz_centrality": { + "seconds": 8.0304, + "peak_rss_anon": 1951928320 + }, + "hits": { + "seconds": 14.1572, + "peak_rss_anon": 1871953920 + }, + "clustering": { + "seconds": 41.828, + "peak_rss_anon": 3036921856 + }, + "core_number": { + "seconds": 18.9826, + "peak_rss_anon": 3196960768 + }, + "strong_components_vector": { + "seconds": 16.3314, + "peak_rss_anon": 1651032064 + }, + "minimum_spanning_forest": { + "seconds": 48.1693, + "peak_rss_anon": 1923809280 + }, + "betweenness_centrality": { + "seconds": 56.4697, + "peak_rss_anon": 2643841024 + }, + "closeness_centrality": { + "seconds": 5.4069, + "peak_rss_anon": 1923829760 + }, + "harmonic_centrality": { + "seconds": 5.3309, + "peak_rss_anon": 1843892224 + }, + "most_similar": { + "seconds": 0.0014, + "peak_rss_anon": 1283878912 + }, + "similarity": { + "seconds": 0.4679, + "peak_rss_anon": 1283891200 + }, + "similar_pairs": { + "seconds": 9.6647, + "peak_rss_anon": 3581648896 + } + }, + "communities": { + "louvain": { + "seconds": 528.1848, + "peak_rss_anon": 6419070976, + "modularity": 0.12086016440899057, + "levels": 5, + "communities": 17, + "segments_written": 4644298752, + "wal_written": 6135551168 + }, + "leiden": { + "seconds": 803.7114, + "peak_rss_anon": 8100745216, + "modularity": 0.18643843717637515, + "levels": 16, + "communities": 15, + "segments_written": 13096304640, + "wal_written": 15060639352 + } + } + }, + "verdicts": [ + { + "workload": "bfs depth 6 vs recursive CTE", + "target": "\u2265 20\u00d7 faster", + "measured": "10.5\u00d7", + "met": false + }, + { + "workload": "reachable_set, full component", + "target": "> 50M edges/s", + "measured": "19M edges/s", + "met": false + }, + { + "workload": "components()", + "target": "< 10 s", + "measured": "5.2 s", + "met": true + }, + { + "workload": "pagerank, 20 iterations", + "target": "< 30 s (8 threads)", + "measured": "12.8 s", + "met": true + }, + { + "workload": "refresh() incl. reverse CSR", + "target": "< 8 min, < 4 GiB RAM", + "measured": "79.1 s, peak 2.71 GB", + "met": true + }, + { + "workload": "diff between two versions", + "target": "< 30 s", + "measured": "18.7 s", + "met": true + }, + { + "workload": "cold load into backend", + "target": "< 15 s", + "measured": "1.3 s", + "met": true + }, + { + "workload": "memory: graph + pagerank scratch within max_cache_memory", + "target": "fits 4 GiB", + "measured": "1.20 GB + 880.00 MB scratch", + "met": true + } + ] +} diff --git a/bench/results/soak/a-text-m10.json b/bench/results/soak/a-text-m10.json new file mode 100644 index 00000000..2016d28f --- /dev/null +++ b/bench/results/soak/a-text-m10.json @@ -0,0 +1,1206 @@ +{ + "provenance": { + "argv": [ + "bench/soak.py", + "a", + "--no-eigen-steps", + "--eigen-max-iter", + "200", + "--disk-floor", + "3221225472", + "--pg-config", + "/var/tmp/m10-pgtree/usr/lib/postgresql/16/bin/pg_config", + "--parent", + "/var/tmp/m10-soak", + "--results", + "/var/tmp/m10-soak/results", + "--extension-revision", + "7934941", + "--extension-profile", + "release", + "--threads", + "4", + "--statement-timeout", + "20min", + "--label=-m10", + "--ids", + "text" + ], + "harness": { + "revision": "79349419e7b2be122e7e1f45779f771243399c71", + "dirty": false + }, + "extension": { + "revision": "7934941", + "profile": "release", + "library": "/var/tmp/m10-pgtree/usr/lib/postgresql/16/lib/pg_warren.so", + "library_sha256": "a935ebf833dcbd0f8a2b232ae83ba520468526c88c28ebffdd61aab8c70910cc" + } + }, + "case": "a", + "nodes": 10000000, + "edges": 100000000, + "weighted": false, + "ids": "text", + "relations": 1, + "store_merged": true, + "threads": 4, + "node_order": "id", + "eigen_max_iter": 200, + "statement_timeout": "20min", + "skip": [], + "planned_stages": [ + "bfs_cte", + "cold_load_probe", + "communities: leiden", + "communities: louvain", + "default: bfs depth 6", + "default: components", + "default: eigen", + "default: pagerank", + "default: prewarm", + "default: reachable_set", + "diff", + "library: betweenness_centrality", + "library: closeness_centrality", + "library: clustering", + "library: core_number", + "library: eigenvector_centrality", + "library: harmonic_centrality", + "library: hits", + "library: katz_centrality", + "library: minimum_spanning_forest", + "library: most_similar", + "library: similar_pairs", + "library: similarity", + "library: strong_components_vector", + "refresh" + ], + "hardware": { + "cpus": 4, + "model": "Intel(R) Xeon(R) Processor", + "memory_bytes": 16872804352, + "kernel": "6.18.44-fc-v153", + "load_average": [ + 0.9580078125, + 1.23583984375, + 1.234375 + ] + }, + "started_at": "2026-10-23T22:24:54+00:00", + "stages": { + "table 0: create": { + "sql": "CREATE UNLOGGED TABLE soak_removed ()", + "seconds": [ + 0.0003 + ], + "median_seconds": 0.0003, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 5562368, + "peak_rss_anon": 5562368, + "vm_hwm": 35557376, + "rss_anon_after": 5562368, + "rss_shmem_after": 15233024 + }, + "table 1: create": { + "sql": "CREATE UNLOGGED TABLE soak_edges (src int4 NOT NULL, dst int4 NOT NULL) WITH (autovacuum_enabled = false)", + "seconds": [ + 0.0003 + ], + "median_seconds": 0.0003, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 5562368, + "peak_rss_anon": 5562368, + "vm_hwm": 35561472, + "rss_anon_after": 5562368, + "rss_shmem_after": 15237120 + }, + "table 2: insert": { + "sql": "INSERT INTO soak_edges SELECT 1 + floor(random() * 10000000)::int4 AS src, 1 + floor(random() * 10000000)::int4 AS dst FROM (SELECT setseed(0.25) OFFSET 0) seeded CROSS JOIN generate_series(1, 100000000)", + "seconds": [ + 33.0763 + ], + "median_seconds": 33.0763, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 5562368, + "peak_rss_anon": 95424512, + "vm_hwm": 1254989824, + "rss_anon_after": 32477184, + "rss_shmem_after": 1095958528 + }, + "table 3: analyze": { + "sql": "ANALYZE soak_edges", + "seconds": [ + 0.2338 + ], + "median_seconds": 0.2338, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 32477184, + "peak_rss_anon": 32481280, + "vm_hwm": 1192595456, + "rss_anon_after": 32481280, + "rss_shmem_after": 1095958528 + }, + "cte: index": { + "sql": "CREATE INDEX soak_edges_src ON soak_edges (src)", + "seconds": [ + 30.1472 + ], + "median_seconds": 30.1472, + "rows": [], + "first_rows": [ + null + ], + "notices": [], + "warnings": [], + "rss_anon_before": 32485376, + "peak_rss_anon": 1101135872, + "vm_hwm": 2260594688, + "rss_anon_after": 27435008, + "rss_shmem_after": 1095995392 + }, + "bfs_cte": { + "sql": "SELECT bench_seconds($soak$WITH RECURSIVE r (id, depth) AS (SELECT 1::int4, 0 UNION SELECT e.dst, r.depth + 1 FROM r JOIN soak_edges e ON e.src = r.id WHERE r.depth < 6) SELECT count(DISTINCT id) FROM r$soak$)", + "seconds": [ + 7.3306 + ], + "median_seconds": 7.3306, + "rows": [ + "7.32833" + ], + "first_rows": [ + "7.32833" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 27435008, + "peak_rss_anon": 324001792, + "vm_hwm": 1483677696, + "rss_anon_after": 68272128, + "rss_shmem_after": 1096048640, + "server_seconds": [ + 7.32833 + ], + "server_median_seconds": 7.32833 + }, + "bfs_cte count": { + "sql": "WITH RECURSIVE r (id, depth) AS (SELECT 1::int4, 0 UNION SELECT e.dst, r.depth + 1 FROM r JOIN soak_edges e ON e.src = r.id WHERE r.depth < 6) SELECT count(DISTINCT id) FROM r", + "seconds": [ + 6.5724 + ], + "median_seconds": 6.5724, + "rows": [ + "1468608" + ], + "first_rows": [ + "1468608" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 68272128, + "peak_rss_anon": 321724416, + "vm_hwm": 1481367552, + "rss_anon_after": 68272128, + "rss_shmem_after": 1096052736 + }, + "create_graph": { + "sql": "SELECT warren.create_graph('soak', $n$SELECT 'https://example.org/resource/' || id FROM generate_series(1::bigint, 10000000) id$n$, $q$SELECT 'https://example.org/resource/' || src, 'https://example.org/resource/' || dst FROM soak_edges$q$, weighted := false, has_relations := false, store_merged := true, node_order := 'id')", + "seconds": [ + 0.0217 + ], + "median_seconds": 0.0217, + "rows": [ + "" + ], + "first_rows": [ + "" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3207168, + "peak_rss_anon": 9756672, + "vm_hwm": 75534336, + "rss_anon_after": 9756672, + "rss_shmem_after": 11776000 + }, + "refresh": { + "sql": "SELECT warren.refresh('soak')", + "seconds": [ + 110.1685 + ], + "median_seconds": 110.1685, + "rows": [ + "1" + ], + "first_rows": [ + "1" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 9756672, + "peak_rss_anon": 1800118272, + "vm_hwm": 2958524416, + "rss_anon_after": 32088064, + "rss_shmem_after": 1112190976 + }, + "refresh from the generator": { + "sql": "SELECT warren.refresh('soak_generated')", + "seconds": [ + 132.5842 + ], + "median_seconds": 132.5842, + "rows": [ + "2" + ], + "first_rows": [ + "2" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 9859072, + "peak_rss_anon": 1872048128, + "vm_hwm": 2118795264, + "rss_anon_after": 32423936, + "rss_shmem_after": 1110802432 + }, + "cold_load_probe": { + "sql": "SELECT warren.prewarm('soak')", + "seconds": [ + 2.0469 + ], + "median_seconds": 2.0469, + "rows": [ + "1" + ], + "first_rows": [ + "1" + ], + "notices": [ + "NOTICE: version 1 (1440138693 bytes) cannot be kept within warren.max_cache_memory (65536 bytes, 0 of them held by transient vectors), so it is held only until the statement ends, the bytes past the cap charged to warren.max_compute_memory, and reloaded by each statement that reads it; raise warren.max_cache_memory" + ], + "warnings": [], + "rss_anon_before": 3211264, + "peak_rss_anon": 1452408832, + "vm_hwm": 2547326976, + "rss_anon_after": 12267520, + "rss_shmem_after": 1077268480 + }, + "default: prewarm": { + "sql": "WITH before AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND 1 IS NOT NULL) AS reads), run AS MATERIALIZED (SELECT warren.prewarm('soak') AS result FROM before WHERE before.reads IS NOT NULL), after AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND run.result IS NOT NULL) AS reads FROM run) SELECT after.reads - before.reads, run.result FROM before, run, after", + "seconds": [ + 1.6693 + ], + "median_seconds": 1.6693, + "rows": [ + "3520|1" + ], + "first_rows": [ + "3520|1" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3207168, + "peak_rss_anon": 1452740608, + "vm_hwm": 2563997696, + "rss_anon_after": 1452720128, + "rss_shmem_after": 1093582848 + }, + "default: bfs depth 6": { + "sql": "SELECT bench_seconds($soak$SELECT count(*) FROM warren.bfs('soak', ARRAY['https://example.org/resource/1'::text], 6)$soak$)", + "seconds": [ + 1.4207, + 1.4104, + 1.4353 + ], + "median_seconds": 1.4207, + "rows": [ + "1.434747" + ], + "first_rows": [ + "1.419787", + "1.409678", + "1.434747" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1452810240, + "peak_rss_anon": 1576800256, + "vm_hwm": 2689433600, + "rss_anon_after": 1456144384, + "rss_shmem_after": 1093582848, + "server_seconds": [ + 1.419787, + 1.409678, + 1.434747 + ], + "server_median_seconds": 1.419787 + }, + "default: bfs depth 6 count": { + "sql": "SELECT count(*) FROM warren.bfs('soak', ARRAY['https://example.org/resource/1'::text], 6)", + "seconds": [ + 1.4077 + ], + "median_seconds": 1.4077, + "rows": [ + "1468608" + ], + "first_rows": [ + "1468608" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1456144384, + "peak_rss_anon": 1576808448, + "vm_hwm": 2689388544, + "rss_anon_after": 1456148480, + "rss_shmem_after": 1093582848 + }, + "default: neighbours": { + "sql": "SELECT bench_seconds($soak$SELECT count(*) FROM warren.neighbours('soak', 'https://example.org/resource/1'::text)$soak$)", + "seconds": [ + 0.0012, + 0.0003, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0002, + 0.0001, + 0.0001, + 0.0001, + 0.0001, + 0.0001, + 0.0001, + 0.0001, + 0.0001, + 0.0001, + 0.0001, + 0.0001, + 0.0004, + 0.0002 + ], + "median_seconds": 0.0001, + "rows": [ + "6.3e-05" + ], + "first_rows": [ + "0.000597", + "9.8e-05", + "6.9e-05", + "9.1e-05", + "7.6e-05", + "6.6e-05", + "5.5e-05", + "5e-05", + "4.8e-05", + "4.8e-05", + "5.3e-05", + "5.4e-05", + "5.2e-05", + "5.1e-05", + "5e-05", + "5e-05", + "4.9e-05", + "4.8e-05", + "8e-05", + "6.3e-05" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1456148480, + "peak_rss_anon": 1456168960, + "vm_hwm": 2569076736, + "rss_anon_after": 1456168960, + "rss_shmem_after": 1093582848, + "server_seconds": [ + 0.000597, + 9.8e-05, + 6.9e-05, + 9.1e-05, + 7.6e-05, + 6.6e-05, + 5.5e-05, + 5e-05, + 4.8e-05, + 4.8e-05, + 5.3e-05, + 5.4e-05, + 5.2e-05, + 5.1e-05, + 5e-05, + 5e-05, + 4.9e-05, + 4.8e-05, + 8e-05, + 6.3e-05 + ], + "server_median_seconds": 5.35e-05 + }, + "default: reachable_set": { + "sql": "SELECT count(*) FROM warren.reachable_set('soak', ARRAY['https://example.org/resource/1'::text])", + "seconds": [ + 7.4852 + ], + "median_seconds": 7.4852, + "rows": [ + "9999584" + ], + "first_rows": [ + "9999584" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1456168960, + "peak_rss_anon": 1889624064, + "vm_hwm": 3002257408, + "rss_anon_after": 1456173056, + "rss_shmem_after": 1093582848 + }, + "default: reachable_set stats": { + "stats": [ + "{\"graph\": \"soak\", \"version\": 1, \"function\": \"reachable_set\", \"truncated\": false, \"nodes_visited\": 9999584, \"edges_traversed\": 17883575}" + ] + }, + "default: components": { + "sql": "SELECT count(*) FROM (SELECT component_id FROM warren.components('soak', NULL::text) GROUP BY 1) c", + "seconds": [ + 10.5773 + ], + "median_seconds": 10.5773, + "rows": [ + "1" + ], + "first_rows": [ + "1" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1456177152, + "peak_rss_anon": 2487447552, + "vm_hwm": 3603296256, + "rss_anon_after": 1444712448, + "rss_shmem_after": 1093582848 + }, + "default: pagerank": { + "sql": "WITH before AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND 1 IS NOT NULL) AS reads), run AS MATERIALIZED (SELECT warren.pagerank('soak', 'pr', tol := 0, max_iter := 20) AS result FROM before WHERE before.reads IS NOT NULL), after AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND run.result IS NOT NULL) AS reads FROM run) SELECT after.reads - before.reads, run.result FROM before, run, after", + "seconds": [ + 15.9343 + ], + "median_seconds": 15.9343, + "rows": [ + "0|20" + ], + "first_rows": [ + "0|20" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1444712448, + "peak_rss_anon": 2503950336, + "vm_hwm": 3635716096, + "rss_anon_after": 1548566528, + "rss_shmem_after": 1110597632 + }, + "default: pagerank from cold": { + "sql": "WITH before AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND 1 IS NOT NULL) AS reads), run AS MATERIALIZED (SELECT warren.pagerank('soak', 'pr', tol := 0, max_iter := 20) AS result FROM before WHERE before.reads IS NOT NULL), after AS MATERIALIZED (SELECT (SELECT pg_stat_get_xact_tuples_returned('warren.segments'::regclass) + pg_stat_get_xact_tuples_fetched('warren.segments'::regclass) + sum(pg_stat_get_xact_tuples_fetched(indexrelid))::bigint FROM pg_index WHERE indrelid = 'warren.segments'::regclass AND run.result IS NOT NULL) AS reads FROM run) SELECT after.reads - before.reads, run.result FROM before, run, after", + "seconds": [ + 17.1348 + ], + "median_seconds": 17.1348, + "rows": [ + "3520|20" + ], + "first_rows": [ + "3520|20" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 28430336, + "peak_rss_anon": 2505232384, + "vm_hwm": 3636690944, + "rss_anon_after": 1549213696, + "rss_shmem_after": 1110724608 + }, + "default: eigen": { + "sql": "SELECT count(*), max(residual) FROM warren.eigen('soak', 20, 'normalized_laplacian', 'smallest', tol := 1e-06, max_iter := 200)", + "seconds": [ + 127.4081 + ], + "median_seconds": 127.4081, + "rows": [ + "20|0.005340023855331318" + ], + "first_rows": [ + "20|0.005340023855331318" + ], + "notices": [], + "warnings": [ + "WARNING: eigen did not converge in 200 steps; the largest residual is 5.340023855331318e-3 (raise max_iter or tol)" + ], + "rss_anon_before": 1549213696, + "peak_rss_anon": 4549701632, + "vm_hwm": 5681664000, + "rss_anon_after": 1549246464, + "rss_shmem_after": 1110724608 + }, + "refresh 2": { + "sql": "SELECT warren.refresh('soak')", + "seconds": [ + 115.5795 + ], + "median_seconds": 115.5795, + "rows": [ + "3" + ], + "first_rows": [ + "3" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3207168, + "peak_rss_anon": 1798815744, + "vm_hwm": 2516946944, + "rss_anon_after": 33226752, + "rss_shmem_after": 1112203264 + }, + "diff": { + "sql": "SELECT warren.diff('soak', 1, 3)", + "seconds": [ + 20.9986 + ], + "median_seconds": 20.9986, + "rows": [ + "{\"to\": 3, \"from\": 1, \"nodes\": {\"added\": 0, \"after\": 10000000, \"before\": 10000000, \"removed\": 0}, \"in_degree\": {\"histogram\": [{\"after\": 421, \"before\": 416, \"degree\": 0}, {\"after\": 4591, \"before\": 4548, \"degree\": 1}, {\"after\": 22931, \"before\": 22749, \"degree\": 2}, {\"after\": 76262, \"before\": 75774, \"degree\": 3}, {\"after\": 190273, \"before\": 189073, \"degree\": 4}, {\"after\": 379665, \"before\": 377767, \"degree\": 5}, {\"after\": 633101, \"before\": 630554, \"degree\": 6}, {\"after\": 903167, \"before\": 900511, \"degree\": 7}, {\"after\": 1128686, \"before\": 1126494, \"degree\": 8}, {\"after\": 1252173, \"before\": 1250680, \"degree\": 9}, {\"after\": 1250935, \"before\": 1250962, \"degree\": 10}, {\"after\": 1137104, \"before\": 1138440, \"degree\": 11}, {\"after\": 946746, \"before\": 948581, \"degree\": 12}, {\"after\": 727241, \"before\": 729533, \"degree\": 13}, {\"after\": 517925, \"before\": 519997, \"degree\": 14}, {\"after\": 344843, \"before\": 346592, \"degree\": 15}, {\"after\": 215787, \"before\": 217120, \"degree\": 16}, {\"after\": 126739, \"before\": 127575, \"degree\": 17}, {\"after\": 70189, \"before\": 70703, \"degree\": 18}, {\"after\": 37024, \"before\": 37346, \"degree\": 19}, {\"after\": 18621, \"before\": 18846, \"degree\": 20}, {\"after\": 8677, \"before\": 8750, \"degree\": 21}, {\"after\": 3991, \"before\": 4033, \"degree\": 22}, {\"after\": 1732, \"before\": 1759, \"degree\": 23}, {\"after\": 688, \"before\": 704, \"degree\": 24}, {\"after\": 312, \"before\": 313, \"degree\": 25}, {\"after\": 114, \"before\": 117, \"degree\": 26}, {\"after\": 35, \"before\": 36, \"degree\": 27}, {\"after\": 16, \"before\": 16, \"degree\": 28}, {\"after\": 6, \"before\": 6, \"degree\": 29}, {\"after\": 3, \"before\": 3, \"degree\": 30}, {\"after\": 1, \"before\": 1, \"degree\": 31}, {\"after\": 1, \"before\": 1, \"degree\": 32}], \"mean_after\": 9.9899934, \"mean_before\": 9.9999953, \"ks_statistic\": 0.0012704}, \"relations\": [{\"added\": 0, \"after\": 99899934, \"before\": 99999953, \"removed\": 100019, \"relation\": \"\"}], \"out_degree\": {\"histogram\": [{\"after\": 10469, \"before\": 469, \"degree\": 0}, {\"after\": 4551, \"before\": 4555, \"degree\": 1}, {\"after\": 22606, \"before\": 22622, \"degree\": 2}, {\"after\": 75539, \"before\": 75613, \"degree\": 3}, {\"after\": 188455, \"before\": 188644, \"degree\": 4}, {\"after\": 378122, \"before\": 378498, \"degree\": 5}, {\"after\": 630702, \"before\": 631364, \"degree\": 6}, {\"after\": 900667, \"before\": 901545, \"degree\": 7}, {\"after\": 1125160, \"before\": 1126303, \"degree\": 8}, {\"after\": 1249551, \"before\": 1250805, \"degree\": 9}, {\"after\": 1249562, \"before\": 1250853, \"degree\": 10}, {\"after\": 1134308, \"before\": 1135417, \"degree\": 11}, {\"after\": 946861, \"before\": 947792, \"degree\": 12}, {\"after\": 728396, \"before\": 729136, \"degree\": 13}, {\"after\": 520328, \"before\": 520792, \"degree\": 14}, {\"after\": 347515, \"before\": 347853, \"degree\": 15}, {\"after\": 217088, \"before\": 217331, \"degree\": 16}, {\"after\": 127520, \"before\": 127646, \"degree\": 17}, {\"after\": 71067, \"before\": 71144, \"degree\": 18}, {\"after\": 37270, \"before\": 37313, \"degree\": 19}, {\"after\": 18523, \"before\": 18541, \"degree\": 20}, {\"after\": 8798, \"before\": 8810, \"degree\": 21}, {\"after\": 4115, \"before\": 4126, \"degree\": 22}, {\"after\": 1689, \"before\": 1690, \"degree\": 23}, {\"after\": 713, \"before\": 713, \"degree\": 24}, {\"after\": 253, \"before\": 253, \"degree\": 25}, {\"after\": 98, \"before\": 98, \"degree\": 26}, {\"after\": 46, \"before\": 46, \"degree\": 27}, {\"after\": 20, \"before\": 20, \"degree\": 28}, {\"after\": 7, \"before\": 7, \"degree\": 29}, {\"after\": 1, \"before\": 1, \"degree\": 30}], \"mean_after\": 9.9899934, \"mean_before\": 9.9999953, \"ks_statistic\": 0.001}, \"all_relations\": {\"added\": 0, \"after\": 99899934, \"before\": 99999953, \"removed\": 100019}}" + ], + "first_rows": [ + "{\"to\": 3, \"from\": 1, \"nodes\": {\"added\": 0, \"after\": 10000000, \"before\": 10000000, \"removed\": 0}, \"in_degree\": {\"histogram\": [{\"after\": 421, \"before\": 416, \"degree\": 0}, {\"after\": 4591, \"before\": 4548, \"degree\": 1}, {\"after\": 22931, \"before\": 22749, \"degree\": 2}, {\"after\": 76262, \"before\": 75774, \"degree\": 3}, {\"after\": 190273, \"before\": 189073, \"degree\": 4}, {\"after\": 379665, \"before\": 377767, \"degree\": 5}, {\"after\": 633101, \"before\": 630554, \"degree\": 6}, {\"after\": 903167, \"before\": 900511, \"degree\": 7}, {\"after\": 1128686, \"before\": 1126494, \"degree\": 8}, {\"after\": 1252173, \"before\": 1250680, \"degree\": 9}, {\"after\": 1250935, \"before\": 1250962, \"degree\": 10}, {\"after\": 1137104, \"before\": 1138440, \"degree\": 11}, {\"after\": 946746, \"before\": 948581, \"degree\": 12}, {\"after\": 727241, \"before\": 729533, \"degree\": 13}, {\"after\": 517925, \"before\": 519997, \"degree\": 14}, {\"after\": 344843, \"before\": 346592, \"degree\": 15}, {\"after\": 215787, \"before\": 217120, \"degree\": 16}, {\"after\": 126739, \"before\": 127575, \"degree\": 17}, {\"after\": 70189, \"before\": 70703, \"degree\": 18}, {\"after\": 37024, \"before\": 37346, \"degree\": 19}, {\"after\": 18621, \"before\": 18846, \"degree\": 20}, {\"after\": 8677, \"before\": 8750, \"degree\": 21}, {\"after\": 3991, \"before\": 4033, \"degree\": 22}, {\"after\": 1732, \"before\": 1759, \"degree\": 23}, {\"after\": 688, \"before\": 704, \"degree\": 24}, {\"after\": 312, \"before\": 313, \"degree\": 25}, {\"after\": 114, \"before\": 117, \"degree\": 26}, {\"after\": 35, \"before\": 36, \"degree\": 27}, {\"after\": 16, \"before\": 16, \"degree\": 28}, {\"after\": 6, \"before\": 6, \"degree\": 29}, {\"after\": 3, \"before\": 3, \"degree\": 30}, {\"after\": 1, \"before\": 1, \"degree\": 31}, {\"after\": 1, \"before\": 1, \"degree\": 32}], \"mean_after\": 9.9899934, \"mean_before\": 9.9999953, \"ks_statistic\": 0.0012704}, \"relations\": [{\"added\": 0, \"after\": 99899934, \"before\": 99999953, \"removed\": 100019, \"relation\": \"\"}], \"out_degree\": {\"histogram\": [{\"after\": 10469, \"before\": 469, \"degree\": 0}, {\"after\": 4551, \"before\": 4555, \"degree\": 1}, {\"after\": 22606, \"before\": 22622, \"degree\": 2}, {\"after\": 75539, \"before\": 75613, \"degree\": 3}, {\"after\": 188455, \"before\": 188644, \"degree\": 4}, {\"after\": 378122, \"before\": 378498, \"degree\": 5}, {\"after\": 630702, \"before\": 631364, \"degree\": 6}, {\"after\": 900667, \"before\": 901545, \"degree\": 7}, {\"after\": 1125160, \"before\": 1126303, \"degree\": 8}, {\"after\": 1249551, \"before\": 1250805, \"degree\": 9}, {\"after\": 1249562, \"before\": 1250853, \"degree\": 10}, {\"after\": 1134308, \"before\": 1135417, \"degree\": 11}, {\"after\": 946861, \"before\": 947792, \"degree\": 12}, {\"after\": 728396, \"before\": 729136, \"degree\": 13}, {\"after\": 520328, \"before\": 520792, \"degree\": 14}, {\"after\": 347515, \"before\": 347853, \"degree\": 15}, {\"after\": 217088, \"before\": 217331, \"degree\": 16}, {\"after\": 127520, \"before\": 127646, \"degree\": 17}, {\"after\": 71067, \"before\": 71144, \"degree\": 18}, {\"after\": 37270, \"before\": 37313, \"degree\": 19}, {\"after\": 18523, \"before\": 18541, \"degree\": 20}, {\"after\": 8798, \"before\": 8810, \"degree\": 21}, {\"after\": 4115, \"before\": 4126, \"degree\": 22}, {\"after\": 1689, \"before\": 1690, \"degree\": 23}, {\"after\": 713, \"before\": 713, \"degree\": 24}, {\"after\": 253, \"before\": 253, \"degree\": 25}, {\"after\": 98, \"before\": 98, \"degree\": 26}, {\"after\": 46, \"before\": 46, \"degree\": 27}, {\"after\": 20, \"before\": 20, \"degree\": 28}, {\"after\": 7, \"before\": 7, \"degree\": 29}, {\"after\": 1, \"before\": 1, \"degree\": 30}], \"mean_after\": 9.9899934, \"mean_before\": 9.9999953, \"ks_statistic\": 0.001}, \"all_relations\": {\"added\": 0, \"after\": 99899934, \"before\": 99999953, \"removed\": 100019}}" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3207168, + "peak_rss_anon": 2971815936, + "vm_hwm": 4083208192, + "rss_anon_after": 2891825152, + "rss_shmem_after": 1093554176 + }, + "distance edit": { + "sql": "SELECT warren.distance('soak', 1, 3, 'edit')", + "seconds": [ + 0.8344 + ], + "median_seconds": 0.8344, + "rows": [ + "{\"to\": 3, \"from\": 1, \"method\": \"edit\", \"overall\": {\"added\": 0, \"union\": 99999953, \"removed\": 100019, \"distance\": 0.0010001904700895209}, \"relations\": [{\"added\": 0, \"union\": 99999953, \"removed\": 100019, \"distance\": 0.0010001904700895209, \"relation\": \"\"}]}" + ], + "first_rows": [ + "{\"to\": 3, \"from\": 1, \"method\": \"edit\", \"overall\": {\"added\": 0, \"union\": 99999953, \"removed\": 100019, \"distance\": 0.0010001904700895209}, \"relations\": [{\"added\": 0, \"union\": 99999953, \"removed\": 100019, \"distance\": 0.0010001904700895209, \"relation\": \"\"}]}" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 2891825152, + "peak_rss_anon": 2891853824, + "vm_hwm": 4003819520, + "rss_anon_after": 2891853824, + "rss_shmem_after": 1093554176 + }, + "distance degree": { + "sql": "SELECT warren.distance('soak', 1, 3, 'degree')", + "seconds": [ + 0.5031 + ], + "median_seconds": 0.5031, + "rows": [ + "{\"ks\": 0.001, \"to\": 3, \"from\": 1, \"method\": \"degree\", \"wasserstein\": 0.0100018999999998}" + ], + "first_rows": [ + "{\"ks\": 0.001, \"to\": 3, \"from\": 1, \"method\": \"degree\", \"wasserstein\": 0.0100018999999998}" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 2891853824, + "peak_rss_anon": 2891939840, + "vm_hwm": 4003905536, + "rss_anon_after": 2891939840, + "rss_shmem_after": 1093554176 + }, + "library: eigenvector_centrality": { + "sql": "SELECT warren.eigenvector_centrality('soak', 'library', tol := 0, max_iter := 20)", + "seconds": [ + 15.2358 + ], + "median_seconds": 15.2358, + "rows": [ + "20" + ], + "first_rows": [ + "20" + ], + "notices": [], + "warnings": [ + "WARNING: eigenvector_centrality did not converge in 20 iterations" + ], + "rss_anon_before": 3207168, + "peak_rss_anon": 2022404096, + "vm_hwm": 3151835136, + "rss_anon_after": 1605738496, + "rss_shmem_after": 1109258240 + }, + "library: katz_centrality": { + "sql": "SELECT warren.katz_centrality('soak', 'library', alpha := 0.01, tol := 0, max_iter := 20)", + "seconds": [ + 11.1667 + ], + "median_seconds": 11.1667, + "rows": [ + "20" + ], + "first_rows": [ + "20" + ], + "notices": [], + "warnings": [ + "WARNING: katz_centrality did not converge in 20 iterations" + ], + "rss_anon_before": 1525747712, + "peak_rss_anon": 2190839808, + "vm_hwm": 3319758848, + "rss_anon_after": 1597394944, + "rss_shmem_after": 1109258240 + }, + "library: hits": { + "sql": "SELECT warren.hits('soak', 'library_hubs', 'library_authorities', tol := 0, max_iter := 20)", + "seconds": [ + 17.4621 + ], + "median_seconds": 17.4621, + "rows": [ + "20" + ], + "first_rows": [ + "20" + ], + "notices": [], + "warnings": [ + "WARNING: hits did not converge in 20 iterations" + ], + "rss_anon_before": 1517391872, + "peak_rss_anon": 2110857216, + "vm_hwm": 3239776256, + "rss_anon_after": 1677418496, + "rss_shmem_after": 1109266432 + }, + "library: clustering": { + "sql": "SELECT warren.clustering('soak', 'library')", + "seconds": [ + 44.4989 + ], + "median_seconds": 44.4989, + "rows": [ + "" + ], + "first_rows": [ + "" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1517412352, + "peak_rss_anon": 3275825152, + "vm_hwm": 4404662272, + "rss_anon_after": 1597452288, + "rss_shmem_after": 1109266432 + }, + "library: core_number": { + "sql": "SELECT warren.core_number('soak', 'library', persist := false)", + "seconds": [ + 20.1942 + ], + "median_seconds": 20.1942, + "rows": [ + "14" + ], + "first_rows": [ + "14" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1517449216, + "peak_rss_anon": 3435864064, + "vm_hwm": 4564836352, + "rss_anon_after": 1597452288, + "rss_shmem_after": 1109266432 + }, + "library: strong_components_vector": { + "sql": "SELECT warren.strong_components_vector('soak', 'library', persist := false)", + "seconds": [ + 16.4737 + ], + "median_seconds": 16.4737, + "rows": [ + "10894" + ], + "first_rows": [ + "10894" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1517449216, + "peak_rss_anon": 1889947648, + "vm_hwm": 3019096064, + "rss_anon_after": 1596538880, + "rss_shmem_after": 1109266432 + }, + "library: minimum_spanning_forest": { + "sql": "SELECT count(*) FROM warren.minimum_spanning_forest('soak', NULL::text)", + "seconds": [ + 51.8667 + ], + "median_seconds": 51.8667, + "rows": [ + "9999999" + ], + "first_rows": [ + "9999999" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1516535808, + "peak_rss_anon": 3546394624, + "vm_hwm": 4678365184, + "rss_anon_after": 1522704384, + "rss_shmem_after": 1109266432 + }, + "library: betweenness_centrality": { + "sql": "SELECT warren.betweenness_centrality('soak', 'library', k := 16, persist := false)", + "seconds": [ + 58.9446 + ], + "median_seconds": 58.9446, + "rows": [ + "16" + ], + "first_rows": [ + "16" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1522704384, + "peak_rss_anon": 2882744320, + "vm_hwm": 4012240896, + "rss_anon_after": 1602711552, + "rss_shmem_after": 1109266432 + }, + "library: closeness_centrality": { + "sql": "SELECT warren.closeness_centrality('soak', 'library', k := 16, persist := false)", + "seconds": [ + 5.468 + ], + "median_seconds": 5.468, + "rows": [ + "16" + ], + "first_rows": [ + "16" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1522708480, + "peak_rss_anon": 2162733056, + "vm_hwm": 3292270592, + "rss_anon_after": 1602813952, + "rss_shmem_after": 1109266432 + }, + "library: harmonic_centrality": { + "sql": "SELECT warren.harmonic_centrality('soak', 'library', k := 16, persist := false)", + "seconds": [ + 5.3836 + ], + "median_seconds": 5.3836, + "rows": [ + "16" + ], + "first_rows": [ + "16" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1522810880, + "peak_rss_anon": 2082832384, + "vm_hwm": 3212296192, + "rss_anon_after": 1602842624, + "rss_shmem_after": 1109266432 + }, + "library: most_similar": { + "sql": "SELECT count(*) FROM warren.most_similar('soak', 'https://example.org/resource/1'::text)", + "seconds": [ + 0.0013 + ], + "median_seconds": 0.0013, + "rows": [ + "10" + ], + "first_rows": [ + "10" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1522839552, + "peak_rss_anon": 1522843648, + "vm_hwm": 2652942336, + "rss_anon_after": 1522843648, + "rss_shmem_after": 1109266432 + }, + "library: similarity": { + "sql": "SELECT count(*) FROM warren.similarity('soak', $p$SELECT 'https://example.org/resource/' || (1 + (i * 7919) % 10000000), 'https://example.org/resource/' || (1 + (i * 104729) % 10000000) FROM generate_series(1::bigint, 100000) i$p$, NULL::text)", + "seconds": [ + 2.153 + ], + "median_seconds": 2.153, + "rows": [ + "100000" + ], + "first_rows": [ + "100000" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1522843648, + "peak_rss_anon": 1602871296, + "vm_hwm": 2733039616, + "rss_anon_after": 1522868224, + "rss_shmem_after": 1109266432 + }, + "library: similar_pairs": { + "sql": "SELECT count(*) FROM warren.similar_pairs('soak', NULL::text, nodes := 'library_mask')", + "seconds": [ + 10.3698 + ], + "median_seconds": 10.3698, + "rows": [ + "1000000" + ], + "first_rows": [ + "1000000" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 1602875392, + "peak_rss_anon": 3820781568, + "vm_hwm": 4950888448, + "rss_anon_after": 1627004928, + "rss_shmem_after": 1109266432 + }, + "communities: louvain": { + "sql": "SELECT warren.louvain('soak', 'louvain', levels_prefix := 'louvain')", + "seconds": [ + 544.5673 + ], + "median_seconds": 544.5673, + "rows": [ + "0.12086005511915653" + ], + "first_rows": [ + "0.12086005511915653" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3362816, + "peak_rss_anon": 6657896448, + "vm_hwm": 7788781568, + "rss_anon_after": 1991094272, + "rss_shmem_after": 1112264704 + }, + "communities: louvain stats": { + "rows": [ + "5|16" + ] + }, + "communities: louvain disk": { + "segments_written": 4314185728, + "wal_written": 6135644120, + "free_disk_before": 15713673216, + "free_disk_after_run": 11399446528, + "free_disk_after_vacuum": 12793331712 + }, + "communities: leiden": { + "sql": "SELECT warren.leiden('soak', 'leiden', levels_prefix := 'leiden')", + "seconds": [ + 811.8227 + ], + "median_seconds": 811.8227, + "rows": [ + "0.18712922388139977" + ], + "first_rows": [ + "0.18712922388139977" + ], + "notices": [], + "warnings": [], + "rss_anon_before": 3362816, + "peak_rss_anon": 8427577344, + "vm_hwm": 9559773184, + "rss_anon_after": 3153145856, + "rss_shmem_after": 1112133632 + }, + "communities: leiden stats": { + "rows": [ + "16|16" + ] + }, + "communities: leiden disk": { + "segments_written": 9513418752, + "wal_written": 15093383728, + "free_disk_before": 12793331712, + "free_disk_after_run": 3279826944, + "free_disk_after_vacuum": 15940083712 + } + }, + "skipped": {}, + "pg_warren": "0.6.0", + "postgres": "16.15 (Ubuntu 16.15-0ubuntu0.24.04.1)", + "edge_table_bytes": 3625689088, + "version_1": { + "seq": 1, + "bytes": 1440138693, + "label": null, + "staged": false, + "current": true, + "vectors": 0, + "version": 1, + "built_at": "2026-10-23T22:26:11.928741+00:00", + "id_space": 10000000, + "built_lsn": "0/1CAE9F8", + "staleness": "00:04:06.210029", + "edge_count": 99999953, + "node_count": 10000000, + "label_vector": null, + "parent_graph": null, + "target_width": 4, + "dropped_edges": 0, + "compacted_from": null, + "parent_version": null, + "deduplicated_edges": 47 + }, + "cached_bytes": 1440138693, + "shared_bytes": 0, + "cache_memory_bytes": 4294967296, + "settings": { + "default": [ + "fsync=off", + "full_page_writes=off", + "jit=on", + "maintenance_work_mem=1GB", + "max_parallel_workers_per_gather=2", + "max_wal_size=1GB", + "shared_buffers=1GB", + "shared_preload_libraries=", + "statement_timeout=20min", + "synchronous_commit=off", + "wal_level=minimal", + "warren.max_build_memory=4GB", + "warren.max_cache_memory=4GB", + "warren.max_compute_memory=4GB", + "warren.shared_cache_memory=4GB", + "warren.threads=4", + "work_mem=64MB" + ] + }, + "version_2": { + "seq": 2, + "bytes": 1439338541, + "label": null, + "staged": false, + "current": true, + "vectors": 0, + "version": 3, + "built_at": "2026-10-23T22:33:29.529677+00:00", + "id_space": 10000000, + "built_lsn": "0/C9189A30", + "staleness": "00:01:55.58821", + "edge_count": 99899934, + "node_count": 10000000, + "label_vector": null, + "parent_graph": null, + "target_width": 4, + "dropped_edges": 0, + "compacted_from": null, + "parent_version": null, + "deduplicated_edges": 47 + }, + "library_version": 3, + "finished_at": "2026-10-23T23:03:53+00:00", + "free_disk_after": 19143208960, + "load_average_after": [ + 1.39208984375, + 1.4462890625, + 1.52685546875 + ], + "measured": { + "cores": 4, + "bfs_seconds": 1.419787, + "bfs_cte_seconds": 7.32833, + "components_seconds": 10.5773, + "pagerank_seconds": 15.9343, + "refresh_seconds": 110.1685, + "refresh_peak_bytes": 2958524416, + "diff_seconds": 20.9986, + "cold_load_seconds": 1.6693, + "load_segment_reads": 3520, + "pagerank_segment_reads": 0, + "pagerank_loads": 0.0, + "pagerank_cold_segment_reads": 3520, + "pagerank_cold_seconds": 17.1348, + "pagerank_cold_loads": 1.0, + "eigen_residual": 0.005340023855331318, + "eigen_converged": false, + "eigen_seconds_per_step": 0.6370405, + "reachable_row_entries_per_second": 2389191.3375728102, + "reachable_edges_per_second": 13359690.188638914, + "cached_bytes": 1440138693, + "id_space": 10000000, + "max_cache_memory": 4294967296, + "library": { + "eigenvector_centrality": { + "seconds": 15.2358, + "peak_rss_anon": 2022404096 + }, + "katz_centrality": { + "seconds": 11.1667, + "peak_rss_anon": 2190839808 + }, + "hits": { + "seconds": 17.4621, + "peak_rss_anon": 2110857216 + }, + "clustering": { + "seconds": 44.4989, + "peak_rss_anon": 3275825152 + }, + "core_number": { + "seconds": 20.1942, + "peak_rss_anon": 3435864064 + }, + "strong_components_vector": { + "seconds": 16.4737, + "peak_rss_anon": 1889947648 + }, + "minimum_spanning_forest": { + "seconds": 51.8667, + "peak_rss_anon": 3546394624 + }, + "betweenness_centrality": { + "seconds": 58.9446, + "peak_rss_anon": 2882744320 + }, + "closeness_centrality": { + "seconds": 5.468, + "peak_rss_anon": 2162733056 + }, + "harmonic_centrality": { + "seconds": 5.3836, + "peak_rss_anon": 2082832384 + }, + "most_similar": { + "seconds": 0.0013, + "peak_rss_anon": 1522843648 + }, + "similarity": { + "seconds": 2.153, + "peak_rss_anon": 1602871296 + }, + "similar_pairs": { + "seconds": 10.3698, + "peak_rss_anon": 3820781568 + } + }, + "communities": { + "louvain": { + "seconds": 544.5673, + "peak_rss_anon": 6657896448, + "modularity": 0.12086005511915653, + "levels": 5, + "communities": 16, + "segments_written": 4314185728, + "wal_written": 6135644120 + }, + "leiden": { + "seconds": 811.8227, + "peak_rss_anon": 8427577344, + "modularity": 0.18712922388139977, + "levels": 16, + "communities": 16, + "segments_written": 9513418752, + "wal_written": 15093383728 + } + } + }, + "verdicts": [ + { + "workload": "bfs depth 6 vs recursive CTE", + "target": "\u2265 20\u00d7 faster", + "measured": "5.2\u00d7", + "met": false + }, + { + "workload": "reachable_set, full component", + "target": "> 50M edges/s", + "measured": "13M edges/s", + "met": false + }, + { + "workload": "components()", + "target": "< 10 s", + "measured": "10.6 s", + "met": false + }, + { + "workload": "pagerank, 20 iterations", + "target": "< 30 s (8 threads)", + "measured": "15.9 s", + "met": true + }, + { + "workload": "refresh() incl. reverse CSR", + "target": "< 8 min, < 4 GiB RAM", + "measured": "110.2 s, peak 2.96 GB", + "met": true + }, + { + "workload": "diff between two versions", + "target": "< 30 s", + "measured": "21.0 s", + "met": true + }, + { + "workload": "cold load into backend", + "target": "< 15 s", + "measured": "1.7 s", + "met": true + }, + { + "workload": "memory: graph + pagerank scratch within max_cache_memory", + "target": "fits 4 GiB", + "measured": "1.44 GB + 880.00 MB scratch", + "met": true + } + ] +}