Skip to content

Commit afa0cdf

Browse files
updates to formatting, new bench results
1 parent 920724a commit afa0cdf

54 files changed

Lines changed: 168 additions & 226 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ Run on a single `m7i.2xlarge` (8 vCPU, 32 GB), the same hardware used by [Apache
137137
</p>
138138
<p align="center"><sub>Apache SpatialBench SF1 · lower is better · linear axis, bars past the cap truncated with their value · TIMEOUT / ERROR annotated</sub></p>
139139

140-
**SF10** (~60M trips). PyCanopy wins 5/12 testcases.
140+
**SF10** (~60M trips). PyCanopy wins 3/12 testcases.
141141

142142
<p align="center">
143143
<img src="assets/spatialbench_sf10_auto.png" alt="PyCanopy vs SedonaDB, DuckDB, and GeoPandas on Apache SpatialBench SF10" width="100%"/>
@@ -154,18 +154,18 @@ All times in seconds. **Bold** = fastest on that query. SedonaDB, DuckDB, and Ge
154154

155155
<table>
156156
<tr><th>Query</th><th>PyCanopy</th><th>SedonaDB</th><th>DuckDB</th><th>GeoPandas</th></tr>
157-
<tr><td>q1</td><td>1.41</td><td><b>0.66</b></td><td>0.96</td><td>12.78</td></tr>
158-
<tr><td>q2</td><td><b>3.94</b></td><td>8.07</td><td>9.95</td><td>20.74</td></tr>
159-
<tr><td>q3</td><td>1.22</td><td><b>0.80</b></td><td>1.17</td><td>13.59</td></tr>
160-
<tr><td>q4</td><td>10.88</td><td><b>8.41</b></td><td>9.83</td><td>25.24</td></tr>
161-
<tr><td>q5</td><td><b>1.77</b></td><td>5.10</td><td>1.80</td><td>47.08</td></tr>
162-
<tr><td>q6</td><td><b>5.57</b></td><td>8.59</td><td>9.36</td><td>24.43</td></tr>
163-
<tr><td>q7</td><td>2.22</td><td><b>1.66</b></td><td>1.82</td><td>137.00</td></tr>
164-
<tr><td>q8</td><td><b>1.06</b></td><td>1.10</td><td>1.08</td><td>16.08</td></tr>
157+
<tr><td>q1</td><td>1.39</td><td><b>0.66</b></td><td>0.96</td><td>12.78</td></tr>
158+
<tr><td>q2</td><td><b>3.74</b></td><td>8.07</td><td>9.95</td><td>20.74</td></tr>
159+
<tr><td>q3</td><td>1.23</td><td><b>0.80</b></td><td>1.17</td><td>13.59</td></tr>
160+
<tr><td>q4</td><td><b>7.44</b></td><td>8.41</td><td>9.83</td><td>25.24</td></tr>
161+
<tr><td>q5</td><td><b>1.71</b></td><td>5.10</td><td>1.80</td><td>47.08</td></tr>
162+
<tr><td>q6</td><td><b>5.51</b></td><td>8.59</td><td>9.36</td><td>24.43</td></tr>
163+
<tr><td>q7</td><td>2.15</td><td><b>1.66</b></td><td>1.82</td><td>137.00</td></tr>
164+
<tr><td>q8</td><td><b>1.04</b></td><td>1.10</td><td>1.08</td><td>16.08</td></tr>
165165
<tr><td>q9</td><td><b>0.23</b></td><td>0.23</td><td>50.15</td><td>0.28</td></tr>
166-
<tr><td>q10</td><td><b>11.62</b></td><td>18.79</td><td>207.84</td><td>46.13</td></tr>
167-
<tr><td>q11</td><td><b>12.43</b></td><td>32.98</td><td>TIMEOUT</td><td>51.01</td></tr>
168-
<tr><td>q12</td><td><b>14.00</b></td><td>14.55</td><td>ERROR</td><td>TIMEOUT</td></tr>
166+
<tr><td>q10</td><td><b>8.65</b></td><td>18.79</td><td>207.84</td><td>46.13</td></tr>
167+
<tr><td>q11</td><td><b>9.90</b></td><td>32.98</td><td>TIMEOUT</td><td>51.01</td></tr>
168+
<tr><td>q12</td><td>14.86</td><td><b>14.55</b></td><td>ERROR</td><td>TIMEOUT</td></tr>
169169
</table>
170170

171171
</td>
@@ -175,18 +175,18 @@ All times in seconds. **Bold** = fastest on that query. SedonaDB, DuckDB, and Ge
175175

176176
<table>
177177
<tr><th>Query</th><th>PyCanopy</th><th>SedonaDB</th><th>DuckDB</th><th>GeoPandas</th></tr>
178-
<tr><td>q1</td><td>8.59</td><td><b>3.04</b></td><td>4.58</td><td>ERROR</td></tr>
179-
<tr><td>q2</td><td>8.95</td><td>8.89</td><td><b>8.26</b></td><td>ERROR</td></tr>
180-
<tr><td>q3</td><td>7.12</td><td><b>4.09</b></td><td>5.17</td><td>TIMEOUT</td></tr>
181-
<tr><td>q4</td><td>21.34</td><td><b>7.52</b></td><td>8.51</td><td>ERROR</td></tr>
182-
<tr><td>q5</td><td>15.22</td><td>50.81</td><td><b>14.40</b></td><td>ERROR</td></tr>
183-
<tr><td>q6</td><td>11.19</td><td><b>9.11</b></td><td>10.67</td><td>ERROR</td></tr>
178+
<tr><td>q1</td><td>8.52</td><td><b>3.04</b></td><td>4.58</td><td>ERROR</td></tr>
179+
<tr><td>q2</td><td>9.39</td><td>8.89</td><td><b>8.26</b></td><td>ERROR</td></tr>
180+
<tr><td>q3</td><td>6.88</td><td><b>4.09</b></td><td>5.17</td><td>TIMEOUT</td></tr>
181+
<tr><td>q4</td><td>17.34</td><td><b>7.52</b></td><td>8.51</td><td>ERROR</td></tr>
182+
<tr><td>q5</td><td>14.60</td><td>50.81</td><td><b>14.40</b></td><td>ERROR</td></tr>
183+
<tr><td>q6</td><td>11.07</td><td><b>9.11</b></td><td>10.67</td><td>ERROR</td></tr>
184184
<tr><td>q7</td><td>22.73</td><td>14.44</td><td><b>14.03</b></td><td>ERROR</td></tr>
185-
<tr><td>q8</td><td><b>7.03</b></td><td>7.24</td><td>7.57</td><td>TIMEOUT</td></tr>
185+
<tr><td>q8</td><td>7.30</td><td><b>7.24</b></td><td>7.57</td><td>TIMEOUT</td></tr>
186186
<tr><td>q9</td><td><b>0.34</b></td><td>0.38</td><td>942.98</td><td>0.49</td></tr>
187-
<tr><td>q10</td><td><b>28.41</b></td><td>42.02</td><td>ERROR</td><td>ERROR</td></tr>
188-
<tr><td>q11</td><td><b>37.30</b></td><td>97.52</td><td>ERROR</td><td>ERROR</td></tr>
189-
<tr><td>q12</td><td>147.67</td><td><b>145.66</b></td><td>ERROR</td><td>TIMEOUT</td></tr>
187+
<tr><td>q10</td><td><b>27.26</b></td><td>42.02</td><td>ERROR</td><td>ERROR</td></tr>
188+
<tr><td>q11</td><td><b>37.21</b></td><td>97.52</td><td>ERROR</td><td>ERROR</td></tr>
189+
<tr><td>q12</td><td>175.31</td><td><b>145.66</b></td><td>ERROR</td><td>TIMEOUT</td></tr>
190190
</table>
191191

192192
</td>

assets/spatial-bench-sf10_auto-results.txt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ SpatialBench SF10 index mode: auto
22

33
query avg (s) runs (s)
44
------------------------------
5-
q1 9.39 (10.86, 8.69, 8.61)
6-
q2 9.27 (10.14, 8.82, 8.84)
7-
q3 6.91 (7.03, 6.83, 6.86)
8-
q4 22.12 (21.81, 21.03, 23.53)
9-
q5 15.03 (15.65, 14.79, 14.64)
10-
q6 10.77 (11.04, 10.62, 10.65)
11-
q7 22.92 (22.65, 23.35, 22.75)
12-
q8 7.34 (7.37, 7.27, 7.38)
13-
q9 0.32 (0.32, 0.32, 0.32)
14-
q10 29.32 (29.42, 29.11, 29.44)
15-
q11 38.92 (38.65, 38.80, 39.30)
16-
q12 165.57 (133.56, 222.61, 140.55)
5+
q1 8.52 (9.61, 7.90, 8.05)
6+
q2 9.39 (9.89, 8.92, 9.34)
7+
q3 6.88 (6.96, 6.84, 6.84)
8+
q4 17.34 (17.43, 17.60, 16.98)
9+
q5 14.60 (14.83, 14.28, 14.69)
10+
q6 11.07 (11.28, 10.58, 11.35)
11+
q7 22.73 (22.90, 22.46, 22.82)
12+
q8 7.30 (7.26, 7.38, 7.27)
13+
q9 0.34 (0.34, 0.34, 0.36)
14+
q10 27.26 (26.50, 26.41, 28.88)
15+
q11 37.21 (37.26, 37.39, 36.99)
16+
q12 175.31 (125.98, 159.81, 240.13)

assets/spatial-bench-sf1_auto-results.txt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ SpatialBench SF1 index mode: auto
22

33
query avg (s) runs (s)
44
------------------------------
5-
q1 1.45 (1.86, 1.25, 1.24)
6-
q2 3.67 (3.86, 3.46, 3.69)
7-
q3 1.25 (1.25, 1.25, 1.24)
8-
q4 11.06 (11.33, 10.82, 11.03)
9-
q5 1.77 (1.79, 1.75, 1.76)
10-
q6 5.88 (5.80, 5.81, 6.03)
11-
q7 2.19 (2.18, 2.21, 2.19)
12-
q8 1.07 (1.07, 1.07, 1.07)
13-
q9 0.25 (0.23, 0.25, 0.26)
14-
q10 11.86 (11.76, 11.99, 11.82)
15-
q11 12.95 (12.68, 12.96, 13.22)
16-
q12 12.19 (14.45, 11.16, 10.94)
5+
q1 1.39 (1.84, 1.16, 1.16)
6+
q2 3.74 (3.78, 3.60, 3.82)
7+
q3 1.23 (1.29, 1.21, 1.20)
8+
q4 7.44 (7.59, 7.54, 7.20)
9+
q5 1.71 (1.75, 1.67, 1.73)
10+
q6 5.51 (5.68, 5.59, 5.27)
11+
q7 2.15 (2.15, 2.11, 2.19)
12+
q8 1.04 (1.05, 1.03, 1.04)
13+
q9 0.23 (0.23, 0.23, 0.22)
14+
q10 8.65 (8.59, 8.60, 8.77)
15+
q11 9.90 (9.75, 10.35, 9.61)
16+
q12 14.86 (13.87, 16.43, 14.28)

assets/spatialbench_sf10_auto.png

31 Bytes
Loading

assets/spatialbench_sf1_auto.png

245 Bytes
Loading

bench/ops/__main__.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@
3333
_RUNS = 3
3434
_BOX_SIDE = 0.1
3535

36-
# Floor for measured constants
37-
_MIN_NS = 0.1
38-
39-
# Default destination for the written report
40-
_OUTPUT_PATH = Path(__file__).resolve().parents[2] / "assets" / "ops.txt"
36+
_MIN_NS = 0.1 # floor for measured constants
37+
_OUTPUT_PATH = Path(__file__).resolve().parents[2] / "assets" / "ops.txt" # written report
4138

4239
_SCAN_FIELDS = ["knn_scan_ns_per_item", "bbox_scan_ns_per_item"]
4340
_POINT_FIELDS = [

bench/spatial_bench/__main__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
"""Launch an ephemeral EC2 box that runs SpatialBench, then fetch the comparison chart.
2-
3-
Reads config.yaml, launches an m7i.2xlarge, measures PyCanopy against published baselines, and downloads the result PNG.
1+
"""
2+
Launch an ephemeral EC2 box that runs SpatialBench, then fetch the comparison chart.
43
"""
54

65
from __future__ import annotations

bench/spatial_bench/_onbox.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
"""On-box entry point: measure PyCanopy on SpatialBench and render the chart.
2-
3-
Called by bootstrap.sh after building PyCanopy on the EC2 box.
1+
"""
2+
On-box entry point: measure PyCanopy on SpatialBench and render the chart.
43
"""
54

65
from __future__ import annotations

bench/spatial_bench/_profile.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
"""Profile path for SpatialBench: per-stage time + sampled memory plus oracle verification.
2-
3-
ProfilingTables wraps only fetch / build so query modules stay unchanged. It is entered
4-
only by `_runner --profile` and run_profile_suite."""
1+
"""
2+
Profile path for SpatialBench: per-stage time + sampled memory plus oracle verification.
3+
"""
54

65
from __future__ import annotations
76

@@ -20,10 +19,8 @@
2019
spawn_query,
2120
)
2221

23-
# Coarse stages the harness can attribute without touching query or Rust code
24-
_STAGES = ("fetch", "build", "query", "collect")
25-
# How often the background thread samples resident memory, in seconds
26-
_SAMPLE_INTERVAL = 0.02
22+
_STAGES = ("fetch", "build", "query", "collect") # coarse stages the harness can attribute
23+
_SAMPLE_INTERVAL = 0.02 # how often the background thread samples resident memory, in seconds
2724
_PAGE_SIZE = os.sysconf("SC_PAGE_SIZE") if hasattr(os, "sysconf") else 4096
2825
_MIB = 1024 * 1024
2926
_SEP = "=" * 64

bench/spatial_bench/_runner.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
"""Subprocess entry point: runs one SpatialBench query in an isolated interpreter."""
1+
"""
2+
Subprocess entry point: runs one SpatialBench query in an isolated interpreter.
3+
"""
24

35
from __future__ import annotations
46

0 commit comments

Comments
 (0)