What I measured
Running the example agent through a real evaluation and packing the submission, the payload sizes come out as:
| scenario |
submission (JSON) |
| 0 (10 static balloons) |
~12 MB |
| 1 (100 balloons, Monte Carlo) |
~234 MB |
For scenario 1, the breakdown by field is:
| field |
size |
read by the leaderboard? |
balloon_world_data.balloon_flights |
165.7 MB (71%) |
no |
balloon_world_data.trajectories |
64.4 MB |
yes (the only field it reads) |
balloon_world_data.rocket_flight |
4.2 MB |
no |
| everything else |
~0 MB |
mostly no |
Why it is worth a look
The upload endpoint reads the whole file into memory and json.loads it, so a 234 MB submission turns into a few GB of Python objects per request. Any upload size limit has to sit above ~250 MB or it will reject real scenario-1 submissions, and with ~100 teams the storage adds up quickly.
The largest field, balloon_flights, is never read by the leaderboard. It is also the same data the viewer already gets from trajectories (balloon_flights is per-balloon, trajectories[...].balloon_states is per-step, but it is the same balloon positions and velocities), and it is fully determined by the run's seed plus scenario_parameters, so it can be recomputed rather than shipped.
Options (all measured)
- Drop
balloon_flights from the submission. Producer-side only, the leaderboard needs no change. 234 MB → ~68 MB. The one thing to confirm first: that no offline re-verification / anti-cheat step relies on the shipped array rather than recomputing it.
- gzip the submission (
.json.gz). 234 MB → ~83 MB, which is smaller than the current pickle. This one does need the leaderboard to gunzip before parsing, so it touches both sides.
- Both together land around ~24 MB.
Context
This came up while moving the submission format off pickle to close the pre-auth deserialization issue on the leaderboard (ARRC-Rocket/BalloonPoppingLeaderboard#7). That format change is a separate, size-neutral PR; I did not fold any trimming into it. I wanted to surface the size question on its own so we can decide the direction together. Happy to send the balloon_flights drop as a small producer-side PR if that is the way we want to go.
What I measured
Running the example agent through a real evaluation and packing the submission, the payload sizes come out as:
For scenario 1, the breakdown by field is:
balloon_world_data.balloon_flightsballoon_world_data.trajectoriesballoon_world_data.rocket_flightWhy it is worth a look
The upload endpoint reads the whole file into memory and
json.loadsit, so a 234 MB submission turns into a few GB of Python objects per request. Any upload size limit has to sit above ~250 MB or it will reject real scenario-1 submissions, and with ~100 teams the storage adds up quickly.The largest field,
balloon_flights, is never read by the leaderboard. It is also the same data the viewer already gets fromtrajectories(balloon_flightsis per-balloon,trajectories[...].balloon_statesis per-step, but it is the same balloon positions and velocities), and it is fully determined by the run's seed plusscenario_parameters, so it can be recomputed rather than shipped.Options (all measured)
balloon_flightsfrom the submission. Producer-side only, the leaderboard needs no change. 234 MB → ~68 MB. The one thing to confirm first: that no offline re-verification / anti-cheat step relies on the shipped array rather than recomputing it..json.gz). 234 MB → ~83 MB, which is smaller than the current pickle. This one does need the leaderboard to gunzip before parsing, so it touches both sides.Context
This came up while moving the submission format off pickle to close the pre-auth deserialization issue on the leaderboard (ARRC-Rocket/BalloonPoppingLeaderboard#7). That format change is a separate, size-neutral PR; I did not fold any trimming into it. I wanted to surface the size question on its own so we can decide the direction together. Happy to send the
balloon_flightsdrop as a small producer-side PR if that is the way we want to go.