Compare commits
11 Commits
dev_masha
...
a491d8bedc
| Author | SHA1 | Date | |
|---|---|---|---|
| a491d8bedc | |||
| 6a04c030cf | |||
| 0e8ef93f80 | |||
| 841f5e1f26 | |||
| 67206ddab3 | |||
| feb0d377b5 | |||
| 8f8a871746 | |||
| 17981792fd | |||
| 4fcbe26ae6 | |||
| ede48f1c60 | |||
| 9144d74d4c |
@@ -14,11 +14,6 @@ and inter-lab exchange.
|
|||||||
|
|
||||||
**Results - interactive, single-file HTML (open in a browser or download and share):**
|
**Results - interactive, single-file HTML (open in a browser or download and share):**
|
||||||
|
|
||||||
- **[Storage Decision](https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision.html)** -
|
|
||||||
one-page executive summary: the problem, the verdict (relational vs graph
|
|
||||||
database), and what it costs - written for management, every claim linked
|
|
||||||
to the full study
|
|
||||||
(source: [docs/research/Tribology_Storage_Decision.html](docs/research/Tribology_Storage_Decision.html)).
|
|
||||||
- **[Storage Format Evaluation](https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html)** -
|
- **[Storage Format Evaluation](https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html)** -
|
||||||
the full study results: dashboard, measured matrix, projections to 6 TB,
|
the full study results: dashboard, measured matrix, projections to 6 TB,
|
||||||
hardware bill of materials, weighted scoring and verdict
|
hardware bill of materials, weighted scoring and verdict
|
||||||
|
|||||||
@@ -1,258 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Storage Decision - Executive Summary</title>
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
||||||
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
||||||
<style>
|
|
||||||
*{box-sizing:border-box}
|
|
||||||
html,body{margin:0;padding:0}
|
|
||||||
body{font-family:"IBM Plex Sans",system-ui,sans-serif;color:#16181d;background:#eef0f2;-webkit-font-smoothing:antialiased}
|
|
||||||
.mono{font-family:"IBM Plex Mono",monospace}
|
|
||||||
|
|
||||||
header.top{display:flex;align-items:center;gap:14px;height:56px;padding:0 22px;background:#fff;border-bottom:1px solid #e2e5ea;position:sticky;top:0;z-index:5}
|
|
||||||
.logo{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:7px;background:#16181d;color:#fff;font-family:"IBM Plex Mono",monospace;font-weight:600;font-size:12px;flex:none}
|
|
||||||
.htitle{display:flex;flex-direction:column;line-height:1.25;white-space:nowrap}
|
|
||||||
.htitle b{font-size:14.5px;font-weight:600;letter-spacing:-.01em}
|
|
||||||
.htitle span{font-size:11.5px;color:#838a95}
|
|
||||||
.hright{margin-left:auto;display:flex;align-items:center;gap:8px}
|
|
||||||
.chip{font-family:"IBM Plex Mono",monospace;font-size:11px;color:#838a95;background:#f3f5f7;border:1px solid #e6e8ec;padding:4px 10px;border-radius:6px;text-decoration:none}
|
|
||||||
a.chip:hover{border-color:#1f5fdb;color:#1f5fdb}
|
|
||||||
.chip-go{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#fff;background:#1f5fdb;padding:5px 12px;border-radius:6px;font-weight:600;text-decoration:none}
|
|
||||||
.chip-go:hover{background:#1a4fb8}
|
|
||||||
|
|
||||||
.page{max-width:980px;margin:0 auto;padding:30px 24px 70px}
|
|
||||||
.card{background:#fff;border:1px solid #e6e8ec;border-radius:12px;padding:22px 26px;margin-bottom:16px}
|
|
||||||
h1{margin:0 0 6px;font-size:24px;font-weight:700;letter-spacing:-.02em}
|
|
||||||
h2{margin:0 0 12px;font-size:16px;font-weight:600;letter-spacing:-.01em}
|
|
||||||
p{margin:0 0 10px;font-size:13.5px;color:#3d424b;line-height:1.65}
|
|
||||||
p:last-child{margin-bottom:0}
|
|
||||||
.muted{color:#838a95}
|
|
||||||
a.ext{color:#1f5fdb;text-decoration:none}
|
|
||||||
a.ext:hover{text-decoration:underline}
|
|
||||||
a.fact{color:inherit;text-decoration:underline dashed;text-decoration-thickness:1px;text-underline-offset:3px}
|
|
||||||
a.fact:hover{text-decoration-style:solid}
|
|
||||||
|
|
||||||
.hero{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}
|
|
||||||
.hero .card{margin:0}
|
|
||||||
.hero .cap{font-family:"IBM Plex Mono",monospace;font-size:10.5px;letter-spacing:.1em;color:#a4abb4;margin-bottom:10px}
|
|
||||||
.hero .big{font-size:15.5px;line-height:1.6;color:#16181d}
|
|
||||||
.verdict{border:1px solid #bfe6cf;background:#e9f8ef;border-radius:12px;padding:16px 22px;display:flex;align-items:flex-start;gap:16px;margin-bottom:20px}
|
|
||||||
.verdict .mark{width:34px;height:34px;border-radius:50%;background:#18a05a;color:#fff;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:700;flex:none;margin-top:2px}
|
|
||||||
.verdict b{color:#0f7a45}
|
|
||||||
.verdict p{margin:0 0 8px;font-size:14.5px}
|
|
||||||
table.vtab{border-collapse:collapse;width:100%}
|
|
||||||
table.vtab th{text-align:left;font-size:11px;font-weight:600;padding:5px 16px 5px 0;border-bottom:1px solid #cdeadb}
|
|
||||||
table.vtab th.win{color:#0f7a45}
|
|
||||||
table.vtab th.lose{color:#b23b4e}
|
|
||||||
table.vtab td{font-size:13px;color:#2b3038;padding:7px 16px 7px 0;border-bottom:1px solid #d9f0e3;line-height:1.5;vertical-align:top}
|
|
||||||
table.vtab tr:last-child td{border-bottom:0}
|
|
||||||
table.vtab td.crit{font-weight:600;color:#16181d;width:26%}
|
|
||||||
table.vtab td.lose{color:#b23b4e}
|
|
||||||
|
|
||||||
.kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:16px}
|
|
||||||
.kpi{background:#fff;border:1px solid #e6e8ec;border-radius:12px;padding:18px 20px}
|
|
||||||
.kpi .v{font-family:"IBM Plex Mono",monospace;font-size:34px;font-weight:600;line-height:1;color:#16181d}
|
|
||||||
.kpi .l{font-size:12.5px;color:#5b6472;margin-top:9px;line-height:1.5}
|
|
||||||
|
|
||||||
table.duel{width:100%;border-collapse:collapse}
|
|
||||||
table.duel th{padding:6px 14px;text-align:left;font-size:12px;border-bottom:2px solid #eef0f2;vertical-align:bottom}
|
|
||||||
table.duel th .pill{display:inline-flex;padding:3px 10px;border-radius:20px;font-size:10.5px;font-weight:600;margin-top:4px}
|
|
||||||
table.duel th.win{color:#0f7a45}
|
|
||||||
table.duel th.win .pill{color:#0f7a45;background:#e7f6ee}
|
|
||||||
table.duel th.lose{color:#b23b4e}
|
|
||||||
table.duel th.lose .pill{color:#b23b4e;background:#fbe9ec}
|
|
||||||
table.duel td{padding:7px 14px;font-size:13px;color:#3d424b;border-bottom:1px solid #f4f5f7;line-height:1.45;vertical-align:top}
|
|
||||||
table.duel td.crit{font-weight:600;color:#16181d;width:26%}
|
|
||||||
table.duel td.crit small{display:block;font-weight:400;color:#a4abb4;margin-top:2px}
|
|
||||||
table.duel td .ok{color:#0f7a45;font-weight:700;margin-right:6px}
|
|
||||||
table.duel td .no{color:#b23b4e;font-weight:700;margin-right:6px}
|
|
||||||
table.duel td.more{width:12%;text-align:right;white-space:nowrap}
|
|
||||||
|
|
||||||
.panels{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:6px}
|
|
||||||
.panel h3{margin:0 0 12px;font-size:12.5px;font-weight:600;color:#5b6472;text-transform:uppercase;letter-spacing:.04em}
|
|
||||||
.brow{display:flex;align-items:center;gap:12px;margin-bottom:12px}
|
|
||||||
.brow .lab{width:118px;flex:none;font-size:12.5px;color:#3d424b}
|
|
||||||
.brow .trk{flex:1;background:#f1f3f6;border-radius:5px;height:20px;overflow:hidden;position:relative}
|
|
||||||
.brow .fill{height:20px;border-radius:0 4px 4px 0;min-width:3px}
|
|
||||||
.brow .inval{position:absolute;top:50%;transform:translateY(-50%);font-family:"IBM Plex Mono",monospace;font-size:12px;font-weight:600;white-space:nowrap}
|
|
||||||
.brow .inval.in-track{left:12px;color:#16181d}
|
|
||||||
.brow .inval.in-fill{right:12px;color:#fff}
|
|
||||||
.brow:hover .trk{background:#eaedf1}
|
|
||||||
.fill.pg{background:#1f5fdb}
|
|
||||||
.fill.rdf{background:#c0476b}
|
|
||||||
|
|
||||||
.steps{counter-reset:st;list-style:none;margin:6px 0 0;padding:0}
|
|
||||||
.steps li{counter-increment:st;display:flex;gap:14px;align-items:flex-start;padding:10px 0;font-size:13.5px;color:#3d424b;line-height:1.6;border-bottom:1px solid #f4f5f7}
|
|
||||||
.steps li:last-child{border-bottom:0}
|
|
||||||
.steps li::before{content:counter(st);width:26px;height:26px;border-radius:50%;background:#eaf1fe;color:#1f5fdb;font-weight:700;font-size:13px;display:flex;align-items:center;justify-content:center;flex:none;margin-top:1px}
|
|
||||||
|
|
||||||
.foot{font-size:11.5px;color:#a4abb4;border-top:1px solid #e6e8ec;padding-top:16px;margin-top:26px;line-height:1.8}
|
|
||||||
@media(max-width:840px){.hero,.kpis,.panels{grid-template-columns:1fr}}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<header class="top">
|
|
||||||
<div class="logo">SE</div>
|
|
||||||
<div class="htitle">
|
|
||||||
<b>Storage Decision</b>
|
|
||||||
<span>Executive summary · laboratory measurement data</span>
|
|
||||||
</div>
|
|
||||||
<div class="hright">
|
|
||||||
<a class="chip" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation" target="_blank" rel="noopener">Git repository</a>
|
|
||||||
<a class="chip-go" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html" target="_blank" rel="noopener">Open the full study →</a>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="page">
|
|
||||||
|
|
||||||
<h1>Which database should hold the laboratory's data?</h1>
|
|
||||||
|
|
||||||
<div class="hero">
|
|
||||||
<div class="card">
|
|
||||||
<div class="cap">THE PROBLEM</div>
|
|
||||||
<p class="big"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#premises" target="_blank" rel="noopener"><b>600 GB</b></a> of laboratory data today.<br/><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#premises" target="_blank" rel="noopener"><b>6 TB</b></a> within a few years.<br/>It needs one working database.</p>
|
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<div class="cap">THE CANDIDATES</div>
|
|
||||||
<p class="big"><b>Relational</b> (PostgreSQL)<br/>vs<br/><b>Graph</b> (RDF triplestore).</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="verdict">
|
|
||||||
<div class="mark">✓</div>
|
|
||||||
<div style="flex:1">
|
|
||||||
<p><b>Decision: Relational vs Graph (RDF):</b></p>
|
|
||||||
<table class="vtab">
|
|
||||||
<tr>
|
|
||||||
<th></th>
|
|
||||||
<th class="win">Relational (PostgreSQL)</th>
|
|
||||||
<th class="lose">Graph (RDF)</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="crit">Average report, today</td>
|
|
||||||
<td><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">~6 seconds</a></td>
|
|
||||||
<td class="lose"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">~1.6 hours</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="crit">Average report at 6 TB</td>
|
|
||||||
<td><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">~30 seconds</a></td>
|
|
||||||
<td class="lose"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">~12 hours</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="crit">Hardware at 6 TB</td>
|
|
||||||
<td><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#hardware" target="_blank" rel="noopener">one ordinary server</a></td>
|
|
||||||
<td class="lose"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#hardware" target="_blank" rel="noopener">a 14-server cluster</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="crit">Ontology</td>
|
|
||||||
<td colspan="2">remains accessible with Relational (PostgreSQL)</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="kpis">
|
|
||||||
<div class="kpi"><div class="v"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#kpis" target="_blank" rel="noopener">1,000x</a></div><div class="l">faster on the average everyday report</div></div>
|
|
||||||
<div class="kpi"><div class="v"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#kpis" target="_blank" rel="noopener">$494k saved</a></div><div class="l">hardware at 6 TB: $33.6k for PGSQL server instead of a $527.7k RDF cluster</div></div>
|
|
||||||
<div class="kpi"><div class="v"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#kpis" target="_blank" rel="noopener">1 vs 14</a></div><div class="l">servers needed at 6 TB</div></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card">
|
|
||||||
<h2>Side by side</h2>
|
|
||||||
<table class="duel">
|
|
||||||
<tr>
|
|
||||||
<th></th>
|
|
||||||
<th class="win">Relational (PostgreSQL)<br><span class="pill">✓ recommended</span></th>
|
|
||||||
<th class="lose">Graph (RDF triplestore)<br><span class="pill">✗ rejected at scale</span></th>
|
|
||||||
<th></th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="crit">Average report, today<small>at 600 GB</small></td>
|
|
||||||
<td><span class="ok">✓</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">about 6 seconds</a></td>
|
|
||||||
<td><span class="no">✗</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">about 1.6 hours; 3 of 7 tasks need more than a day</a></td>
|
|
||||||
<td class="more"><a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html#proj" target="_blank" rel="noopener">details →</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="crit">Average report at 6 TB<small>the 3-year horizon</small></td>
|
|
||||||
<td><span class="ok">✓</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">about 30 seconds</a></td>
|
|
||||||
<td><span class="no">✗</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">about 12 hours; 5 of 7 tasks need a day or more</a></td>
|
|
||||||
<td class="more"><a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html#proj" target="_blank" rel="noopener">details →</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="crit">Servers needed today<small>at 600 GB</small></td>
|
|
||||||
<td><span class="ok">✓</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#hardware" target="_blank" rel="noopener">one standard server, $10.5k</a></td>
|
|
||||||
<td><span class="no">✗</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#hardware" target="_blank" rel="noopener">already two servers with 1.4 TB of memory, $58.7k</a></td>
|
|
||||||
<td class="more"><a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html#hw" target="_blank" rel="noopener">details →</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="crit">Servers at 6 TB</td>
|
|
||||||
<td><span class="ok">✓</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#hardware" target="_blank" rel="noopener">still one server, $33.6k</a></td>
|
|
||||||
<td><span class="no">✗</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#hardware" target="_blank" rel="noopener">a 14-server cluster, $527.7k</a></td>
|
|
||||||
<td class="more"><a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html#hw" target="_blank" rel="noopener">details →</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="crit">Disk for the same data<small>at 6 TB</small></td>
|
|
||||||
<td><span class="ok">✓</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#storage" target="_blank" rel="noopener">21 TB</a></td>
|
|
||||||
<td><span class="no">✗</span><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#storage" target="_blank" rel="noopener">91 TB - the graph form stores the same data 4.4x bigger</a></td>
|
|
||||||
<td class="more"><a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html#storage" target="_blank" rel="noopener">details →</a></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card">
|
|
||||||
<h2>Average everyday report</h2>
|
|
||||||
<div class="panels">
|
|
||||||
<div class="panel">
|
|
||||||
<h3>Today · 600 GB</h3>
|
|
||||||
<div class="brow" title="PostgreSQL, average of the 7 everyday tasks at 600 GB: about 6 seconds (projected)">
|
|
||||||
<div class="lab">PostgreSQL</div>
|
|
||||||
<div class="trk"><div class="fill pg" style="width:0.4%"></div><span class="inval in-track"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">6 s</a></span></div>
|
|
||||||
</div>
|
|
||||||
<div class="brow" title="RDF triplestore, average of the 7 everyday tasks at 600 GB: about 1.6 hours (projected)">
|
|
||||||
<div class="lab">Graph (RDF)</div>
|
|
||||||
<div class="trk"><div class="fill rdf" style="width:100%"></div><span class="inval in-fill"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">1.6 h</a></span></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="panel">
|
|
||||||
<h3>In a few years · 6 TB</h3>
|
|
||||||
<div class="brow" title="PostgreSQL, average of the 7 everyday tasks at 6 TB: about 30 seconds (projected)">
|
|
||||||
<div class="lab">PostgreSQL</div>
|
|
||||||
<div class="trk"><div class="fill pg" style="width:0.4%"></div><span class="inval in-track"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">30 s</a></span></div>
|
|
||||||
</div>
|
|
||||||
<div class="brow" title="RDF triplestore, average of the 7 everyday tasks at 6 TB: about 12 hours (projected)">
|
|
||||||
<div class="lab">Graph (RDF)</div>
|
|
||||||
<div class="trk"><div class="fill rdf" style="width:100%"></div><span class="inval in-fill"><a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#performance" target="_blank" rel="noopener">12 h</a></span></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p class="muted" style="margin-top:14px">Bars are to scale within each panel - the blue bar is real, it is just that small. An everyday report that takes hours is a report nobody runs.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card">
|
|
||||||
<h2>What about the other formats?</h2>
|
|
||||||
<p><b>CSV</b> stays exactly where it belongs - the raw archive coming off the instruments (best compression, byte-reproducible). <b>JSON-LD</b> stays the exchange format for sending data between laboratories. Neither is a working database, so neither was a candidate. <b>SQLite</b> is excellent for a single user <a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#notes" target="_blank" rel="noopener">up to ~600 GB</a> but does not scale to the shared 6 TB horizon.</p>
|
|
||||||
<p><b>And the ontology?</b> It survives intact: semantic, ontology-style access is provided as a <b>virtual layer on top of PostgreSQL</b> (e.g. Ontop OBDA) - the graph view without the graph database's cost.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card">
|
|
||||||
<h2>Recommended next steps</h2>
|
|
||||||
<ol class="steps">
|
|
||||||
<li>Adopt <b>PostgreSQL as the system of record</b> for laboratory measurement data; keep the raw CSV archive as the source of truth for reprocessing.</li>
|
|
||||||
<li>Provide ontology and semantic queries as a <b>virtual RDF layer</b> over PostgreSQL - no data is copied into a triplestore.</li>
|
|
||||||
<li>Revisit hardware once volume approaches 6 TB: the measured plan is <a class="fact" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html#hardware" target="_blank" rel="noopener">one 16-core server with 551 GB RAM (~$33.6k at July 2026 prices)</a>.</li>
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="foot">
|
|
||||||
Figures at 600 GB and 6 TB are model projections calibrated on a measured benchmark (7 everyday retrieval tasks x 5 storage formats, every result checksum-validated); the "average report" is the geometric mean of the seven tasks, the same averaging the study's scoring uses. Method, raw data and hardware price sources: <a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision_Facts.html" target="_blank" rel="noopener">facts ledger (every number traced to its artifact)</a> · <a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html" target="_blank" rel="noopener">full interactive study</a> · <a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation" target="_blank" rel="noopener">git.boskadoff.com/Public/LabDataStorageEvaluation</a>.<br>
|
|
||||||
Study: Mary Goncharenko (Tribology Laboratory, University of Florida; internship at Sandia National Laboratories), with the technical assistance of Vasiliy Goncharenko (SoftCreator, LLC).
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Decision Facts Ledger - Storage Decision</title>
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
||||||
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
||||||
<style>
|
|
||||||
*{box-sizing:border-box}
|
|
||||||
html,body{margin:0;padding:0}
|
|
||||||
body{font-family:"IBM Plex Sans",system-ui,sans-serif;color:#16181d;background:#eef0f2;-webkit-font-smoothing:antialiased}
|
|
||||||
.mono{font-family:"IBM Plex Mono",monospace}
|
|
||||||
header.top{display:flex;align-items:center;gap:14px;height:56px;padding:0 22px;background:#fff;border-bottom:1px solid #e2e5ea;position:sticky;top:0;z-index:5}
|
|
||||||
.logo{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:7px;background:#16181d;color:#fff;font-family:"IBM Plex Mono",monospace;font-weight:600;font-size:12px;flex:none}
|
|
||||||
.htitle{display:flex;flex-direction:column;line-height:1.25;white-space:nowrap}
|
|
||||||
.htitle b{font-size:14.5px;font-weight:600;letter-spacing:-.01em}
|
|
||||||
.htitle span{font-size:11.5px;color:#838a95}
|
|
||||||
.hright{margin-left:auto;display:flex;align-items:center;gap:8px}
|
|
||||||
.chip{font-family:"IBM Plex Mono",monospace;font-size:11px;color:#838a95;background:#f3f5f7;border:1px solid #e6e8ec;padding:4px 10px;border-radius:6px;text-decoration:none}
|
|
||||||
a.chip:hover{border-color:#1f5fdb;color:#1f5fdb}
|
|
||||||
.page{max-width:1080px;margin:0 auto;padding:28px 24px 70px}
|
|
||||||
h1{margin:0 0 6px;font-size:22px;font-weight:700;letter-spacing:-.02em}
|
|
||||||
h2{margin:26px 0 10px;font-size:15px;font-weight:600}
|
|
||||||
p{margin:0 0 10px;font-size:13px;color:#3d424b;line-height:1.6;max-width:940px}
|
|
||||||
.muted{color:#838a95}
|
|
||||||
a{color:#1f5fdb;text-decoration:none}
|
|
||||||
a:hover{text-decoration:underline}
|
|
||||||
.card{background:#fff;border:1px solid #e6e8ec;border-radius:11px;padding:6px 18px 10px;margin-bottom:8px;overflow-x:auto}
|
|
||||||
table{width:100%;border-collapse:collapse;min-width:760px}
|
|
||||||
th{font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;color:#838a95;font-weight:600;text-align:left;padding:9px 12px;border-bottom:1px solid #eef0f2}
|
|
||||||
td{font-size:12.5px;color:#3d424b;padding:9px 12px;border-bottom:1px solid #f4f5f7;vertical-align:top;line-height:1.55}
|
|
||||||
tr:last-child td{border-bottom:0}
|
|
||||||
td.id{font-family:"IBM Plex Mono",monospace;font-weight:600;color:#16181d;white-space:nowrap}
|
|
||||||
td.val{font-family:"IBM Plex Mono",monospace;white-space:nowrap}
|
|
||||||
.foot{font-size:11.5px;color:#a4abb4;border-top:1px solid #e6e8ec;padding-top:14px;margin-top:26px;line-height:1.7}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<header class="top">
|
|
||||||
<div class="logo">SE</div>
|
|
||||||
<div class="htitle">
|
|
||||||
<b>Decision Facts Ledger</b>
|
|
||||||
<span>Every fact on the Storage Decision page · value, formula, source</span>
|
|
||||||
</div>
|
|
||||||
<div class="hright">
|
|
||||||
<a class="chip" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision.html" target="_blank" rel="noopener">← Storage Decision</a>
|
|
||||||
<a class="chip" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html" target="_blank" rel="noopener">Full study</a>
|
|
||||||
<a class="chip" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation" target="_blank" rel="noopener">Git repository</a>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="page">
|
|
||||||
|
|
||||||
<h1>Decision Facts Ledger</h1>
|
|
||||||
<p>Every number shown on the <a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision.html" target="_blank" rel="noopener">Storage Decision</a> executive summary, traced to the artifact that proves it. All source files are committed in the public repository and regenerate deterministically from seed 20260711. Projection tables carry one row per format x task x scale; "geometric mean" is the same averaging the study's scoring uses.</p>
|
|
||||||
<p class="muted">Sources: <span class="mono">t6</span> = <a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6_projected_all_scales.csv</a> · <span class="mono">t7</span> = <a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t7_hardware_all_scales.csv" target="_blank" rel="noopener">t7_hardware_all_scales.csv</a> · <span class="mono">t1</span> = <a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t1_storage_footprint.csv" target="_blank" rel="noopener">t1_storage_footprint.csv</a> · <span class="mono">prices</span> = <a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/config/hw_prices.yaml" target="_blank" rel="noopener">hw_prices.yaml</a> · <span class="mono">spec</span> = <a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/docs/specs/10_extrapolation_model.md" target="_blank" rel="noopener">10_extrapolation_model.md</a></p>
|
|
||||||
|
|
||||||
<h2 id="premises">Premises</h2>
|
|
||||||
<div class="card">
|
|
||||||
<table>
|
|
||||||
<tr><th>ID</th><th>Fact on the page</th><th>Exact value</th><th>How obtained</th><th>Source</th></tr>
|
|
||||||
<tr><td class="id">P1</td><td>"600 GB of laboratory data today"</td><td class="val">600 GB</td><td>The laboratory's current operational volume; also the first extrapolation scale of the study (scale_gb = 600).</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/docs/specs/10_extrapolation_model.md" target="_blank" rel="noopener">spec</a>, <a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
<tr><td class="id">P2</td><td>"6 TB within a few years"</td><td class="val">6,000 GB</td><td>The largest extrapolation scale of the study (scale_gb = 6000), the growth horizon.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/docs/specs/10_extrapolation_model.md" target="_blank" rel="noopener">spec</a>, <a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 id="performance">Performance (average everyday report)</h2>
|
|
||||||
<div class="card">
|
|
||||||
<table>
|
|
||||||
<tr><th>ID</th><th>Fact on the page</th><th>Exact value</th><th>How obtained</th><th>Source</th></tr>
|
|
||||||
<tr><td class="id">F1</td><td>PostgreSQL, average report today: "~6 seconds"</td><td class="val">5.66 s</td><td>Geometric mean of the 7 projected_wall_s values where format = PostgreSQL, scale_gb = 600.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
<tr><td class="id">F2</td><td>PostgreSQL, average report at 6 TB: "~30 seconds"</td><td class="val">29.6 s</td><td>Geometric mean, format = PostgreSQL, scale_gb = 6000.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
<tr><td class="id">F3</td><td>Graph (RDF), average report today: "~1.6 hours"</td><td class="val">5,902 s = 1.64 h</td><td>Geometric mean, format = RDF triplestore, scale_gb = 600.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
<tr><td class="id">F4</td><td>Graph (RDF), average report at 6 TB: "~12 hours"</td><td class="val">43,157 s = 11.99 h</td><td>Geometric mean, format = RDF triplestore, scale_gb = 6000.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
<tr><td class="id">F5</td><td>"3 of 7 tasks need more than a day" (RDF, today)</td><td class="val">q3 2.1 d · q5 2.8 d · q7 1.9 d</td><td>Count of RDF rows at scale_gb = 600 with projected_wall_s > 86,400.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
<tr><td class="id">F6</td><td>"5 of 7 tasks need a day or more" (RDF, 6 TB)</td><td class="val">q2, q3, q4, q5, q7</td><td>Count of RDF rows at scale_gb = 6000 with projected_wall_s >= 86,400.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 id="hardware">Hardware and cost</h2>
|
|
||||||
<div class="card">
|
|
||||||
<table>
|
|
||||||
<tr><th>ID</th><th>Fact on the page</th><th>Exact value</th><th>How obtained</th><th>Source</th></tr>
|
|
||||||
<tr><td class="id">F7</td><td>"one standard server, $10.5k" (PostgreSQL, today)</td><td class="val">$10,500 · 1 node</td><td>Row format = PostgreSQL, scale_gb = 600: est_cost_usd, nodes; bill of materials in the configuration column.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t7_hardware_all_scales.csv" target="_blank" rel="noopener">t7</a></td></tr>
|
|
||||||
<tr><td class="id">F8</td><td>"already two servers with 1.4 TB of memory, $58.7k" (RDF, today)</td><td class="val">$58,740 · 2 nodes · 1,404.1 GB RAM</td><td>Row format = RDF triplestore, scale_gb = 600: est_cost_usd, nodes, ram_gb.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t7_hardware_all_scales.csv" target="_blank" rel="noopener">t7</a></td></tr>
|
|
||||||
<tr><td class="id">F9</td><td>"still one server, $33.6k" / "one 16-core server with 551 GB RAM" (PostgreSQL, 6 TB)</td><td class="val">$33,586 · 1 node · 16 cores · 551.3 GB</td><td>Row format = PostgreSQL, scale_gb = 6000: est_cost_usd, nodes, cores, ram_gb.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t7_hardware_all_scales.csv" target="_blank" rel="noopener">t7</a></td></tr>
|
|
||||||
<tr><td class="id">F10</td><td>"a 14-server cluster, $527.7k" (RDF, 6 TB)</td><td class="val">$527,732 · 14 nodes</td><td>Row format = RDF triplestore, scale_gb = 6000: est_cost_usd, nodes.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t7_hardware_all_scales.csv" target="_blank" rel="noopener">t7</a></td></tr>
|
|
||||||
<tr><td class="id">F11</td><td>"July 2026 prices"</td><td class="val">as_of 2026-07-11</td><td>Street prices with per-component source URLs recorded in the operator-editable price file.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/config/hw_prices.yaml" target="_blank" rel="noopener">prices</a></td></tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 id="storage">Storage</h2>
|
|
||||||
<div class="card">
|
|
||||||
<table>
|
|
||||||
<tr><th>ID</th><th>Fact on the page</th><th>Exact value</th><th>How obtained</th><th>Source</th></tr>
|
|
||||||
<tr><td class="id">F12</td><td>"21 TB" disk (PostgreSQL, 6 TB)</td><td class="val">20.855 TB</td><td>Row format = PostgreSQL, scale_gb = 6000: disk_tb (includes 30% free-space headroom).</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t7_hardware_all_scales.csv" target="_blank" rel="noopener">t7</a></td></tr>
|
|
||||||
<tr><td class="id">F13</td><td>"91 TB" disk (RDF, 6 TB)</td><td class="val">91.268 TB</td><td>Row format = RDF triplestore, scale_gb = 6000: disk_tb.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t7_hardware_all_scales.csv" target="_blank" rel="noopener">t7</a></td></tr>
|
|
||||||
<tr><td class="id">F14</td><td>"stores the same data 4.4x bigger"</td><td class="val">11.70 / 2.67 = 4.38</td><td>Ratio of the measured working-footprint coefficients vs raw CSV (RDF 11.70x over PostgreSQL 2.67x).</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t1_storage_footprint.csv" target="_blank" rel="noopener">t1</a></td></tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 id="kpis">Headline figures</h2>
|
|
||||||
<div class="card">
|
|
||||||
<table>
|
|
||||||
<tr><th>ID</th><th>Fact on the page</th><th>Exact value</th><th>How obtained</th><th>Source</th></tr>
|
|
||||||
<tr><td class="id">K1</td><td>"1,000x faster on the average everyday report"</td><td class="val">1,043x today · 1,459x at 6 TB</td><td>F3 / F1 = 5,902 / 5.66; F4 / F2 = 43,157 / 29.6. Stated conservatively as 1,000x.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
<tr><td class="id">K2</td><td>"$494k saved" (hardware at 6 TB)</td><td class="val">$494,146</td><td>F10 - F9 = 527,732 - 33,586.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t7_hardware_all_scales.csv" target="_blank" rel="noopener">t7</a></td></tr>
|
|
||||||
<tr><td class="id">K3</td><td>"1 vs 14 servers needed at 6 TB"</td><td class="val">nodes: 1 vs 14</td><td>nodes column, rows PostgreSQL/6000 and RDF triplestore/6000.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t7_hardware_all_scales.csv" target="_blank" rel="noopener">t7</a></td></tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 id="notes">Notes</h2>
|
|
||||||
<div class="card">
|
|
||||||
<table>
|
|
||||||
<tr><th>ID</th><th>Fact on the page</th><th>Exact value</th><th>How obtained</th><th>Source</th></tr>
|
|
||||||
<tr><td class="id">N1</td><td>"SQLite is excellent for a single user up to ~600 GB"</td><td class="val">all 7 tasks OK at 600 GB; q5 = 1.6 h, q7 = 1.5 h at 1.2 TB</td><td>SQLite rows in t6: every flag OK at scale_gb = 600; its single-threaded full scans exceed the 1-hour bound from scale_gb = 1200.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/src/branch/master/out/report/tables/t6_projected_all_scales.csv" target="_blank" rel="noopener">t6</a></td></tr>
|
|
||||||
<tr><td class="id">N2</td><td>Method behind every projected number</td><td class="val">measured 35-cell benchmark</td><td>Scaling laws calibrated on the measured corpus; every measured run checksum-validated. Full methodology and measured medians in the interactive study.</td><td><a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html" target="_blank" rel="noopener">full study</a></td></tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="foot">
|
|
||||||
Part of the LabDataStorageEvaluation study · run of 2026-07-11, seed 20260711 · canonical source: <a href="https://git.boskadoff.com/Public/LabDataStorageEvaluation" target="_blank" rel="noopener">git.boskadoff.com/Public/LabDataStorageEvaluation</a>.<br>
|
|
||||||
Study: Mary Goncharenko (Tribology Laboratory, University of Florida; internship at Sandia National Laboratories), with the technical assistance of Vasiliy Goncharenko (SoftCreator, LLC).
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
<!-- ================= DASHBOARD ================= -->
|
<!-- ================= DASHBOARD ================= -->
|
||||||
<section id="dashboard" class="on">
|
<section id="dashboard" class="on">
|
||||||
<h1>Dashboard</h1>
|
<h1>Dashboard</h1>
|
||||||
<p class="sub">A 141.8 MiB physically plausible CSV corpus (the canonical raw format) was converted into four other storage formats and benchmarked on seven laboratory retrieval scenarios with subprocess-isolated resource metering; results were extrapolated to 600 GB, 1.2 TB and 6 TB. Every measured run validated its rows against canonical results (PostgreSQL cross-validated with SQLite, tolerance 1e-9). Short on time? The one-page management summary is <a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision.html" target="_blank" rel="noopener">Storage Decision</a>.</p>
|
<p class="sub">A 141.8 MiB physically plausible CSV corpus (the canonical raw format) was converted into four other storage formats and benchmarked on seven laboratory retrieval scenarios with subprocess-isolated resource metering; results were extrapolated to 600 GB, 1.2 TB and 6 TB. Every measured run validated its rows against canonical results (PostgreSQL cross-validated with SQLite, tolerance 1e-9).</p>
|
||||||
<div class="kpis">
|
<div class="kpis">
|
||||||
<div class="kpi"><div class="l">Benchmark cells</div><div class="v v-good">35 / 35</div><div class="s">OK; 0 invalid, 0 timeouts</div></div>
|
<div class="kpi"><div class="l">Benchmark cells</div><div class="v v-good">35 / 35</div><div class="s">OK; 0 invalid, 0 timeouts</div></div>
|
||||||
<div class="kpi"><div class="l">Corpus</div><div class="v v-neutral">141.8 MiB</div><div class="s">8,718 CSV files, byte-reproducible</div></div>
|
<div class="kpi"><div class="l">Corpus</div><div class="v v-neutral">141.8 MiB</div><div class="s">8,718 CSV files, byte-reproducible</div></div>
|
||||||
@@ -450,7 +450,7 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
<h3>Data statement</h3>
|
<h3>Data statement</h3>
|
||||||
<p>The measurement corpus is simulated: physically plausible models of a Pt-Au LDRD tribology study context at Sandia National Laboratories, generated from a fixed random seed. It contains no experimental measurements and no export-controlled data. Hardware prices cited in the cost model are public street prices retrieved 2026-07-11 (sources in the Hardware & Cost section).</p>
|
<p>The measurement corpus is simulated: physically plausible models of a Pt-Au LDRD tribology study context at Sandia National Laboratories, generated from a fixed random seed. It contains no experimental measurements and no export-controlled data. Hardware prices cited in the cost model are public street prices retrieved 2026-07-11 (sources in the Hardware & Cost section).</p>
|
||||||
<p>Companion pages in the same repository: <a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision.html" target="_blank" rel="noopener">Storage Decision (one-page executive summary)</a> · <a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_FK_Architecture.html" target="_blank" rel="noopener">Foreign-Key Architecture Study</a>.</p>
|
<p>Related study in the same repository: <a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_FK_Architecture.html" target="_blank" rel="noopener">Foreign-Key Architecture Study</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="foot">Standalone distributable file. If you received this document outside the repository, the canonical source is <a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation" target="_blank" rel="noopener">git.boskadoff.com/Public/LabDataStorageEvaluation</a>.</div>
|
<div class="foot">Standalone distributable file. If you received this document outside the repository, the canonical source is <a class="ext" href="https://git.boskadoff.com/Public/LabDataStorageEvaluation" target="_blank" rel="noopener">git.boskadoff.com/Public/LabDataStorageEvaluation</a>.</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -615,10 +615,8 @@ function tabs(containerId, items, onPick){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ---------- navigation ---------- */
|
/* ---------- navigation ---------- */
|
||||||
/* menu items only: the sidebar footer also holds a regular external link */
|
const navLinks = document.querySelectorAll("nav.side a");
|
||||||
const navLinks = document.querySelectorAll('nav.side a[href^="#"]');
|
|
||||||
function show(id){
|
function show(id){
|
||||||
if(!document.getElementById(id)) return;
|
|
||||||
document.querySelectorAll("main section").forEach(s => s.classList.toggle("on", s.id === id));
|
document.querySelectorAll("main section").forEach(s => s.classList.toggle("on", s.id === id));
|
||||||
navLinks.forEach(a => a.classList.toggle("active", a.getAttribute("href") === "#" + id));
|
navLinks.forEach(a => a.classList.toggle("active", a.getAttribute("href") === "#" + id));
|
||||||
el("main").scrollTop = 0;
|
el("main").scrollTop = 0;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
task: '11'
|
task: '11'
|
||||||
status: ok
|
status: ok
|
||||||
charts: 14
|
charts: 14
|
||||||
tables: 7
|
tables: 5
|
||||||
report_bytes: 16091
|
report_bytes: 16091
|
||||||
winner_600gb: pg
|
winner_600gb: pg
|
||||||
prices_as_of: 2026-07-11
|
prices_as_of: 2026-07-11
|
||||||
|
|||||||
@@ -1,106 +0,0 @@
|
|||||||
format,query,scale_gb,projected_wall_s,projected_wall,flag
|
|
||||||
CSV,q1,600,0.06,0.06 s,OK
|
|
||||||
CSV,q1,1200,0.06,0.06 s,OK
|
|
||||||
CSV,q1,6000,0.06,0.06 s,OK
|
|
||||||
CSV,q2,600,428.301,7.1 min,OK
|
|
||||||
CSV,q2,1200,856.543,14.3 min,OK
|
|
||||||
CSV,q2,6000,4282.474,71.4 min,IMPRACTICAL
|
|
||||||
CSV,q3,600,4408.0,73.5 min,IMPRACTICAL
|
|
||||||
CSV,q3,1200,8815.94,2.4 h,IMPRACTICAL
|
|
||||||
CSV,q3,6000,44079.46,12.2 h,IMPRACTICAL
|
|
||||||
CSV,q4,600,2643.775,44.1 min,OK
|
|
||||||
CSV,q4,1200,5287.489,88.1 min,IMPRACTICAL
|
|
||||||
CSV,q4,6000,26437.206,7.3 h,IMPRACTICAL
|
|
||||||
CSV,q5,600,4176.725,69.6 min,IMPRACTICAL
|
|
||||||
CSV,q5,1200,8353.391,2.3 h,IMPRACTICAL
|
|
||||||
CSV,q5,6000,41766.715,11.6 h,IMPRACTICAL
|
|
||||||
CSV,q6,600,870.266,14.5 min,OK
|
|
||||||
CSV,q6,1200,1740.472,29.0 min,OK
|
|
||||||
CSV,q6,6000,8702.119,2.4 h,IMPRACTICAL
|
|
||||||
CSV,q7,600,4897.995,81.6 min,IMPRACTICAL
|
|
||||||
CSV,q7,1200,9795.931,2.7 h,IMPRACTICAL
|
|
||||||
CSV,q7,6000,48979.414,13.6 h,IMPRACTICAL
|
|
||||||
JSON-LD,q1,600,0.111,0.11 s,OK
|
|
||||||
JSON-LD,q1,1200,0.111,0.11 s,OK
|
|
||||||
JSON-LD,q1,6000,0.111,0.11 s,OK
|
|
||||||
JSON-LD,q2,600,5519.622,92.0 min,IMPRACTICAL
|
|
||||||
JSON-LD,q2,1200,11039.133,3.1 h,IMPRACTICAL
|
|
||||||
JSON-LD,q2,6000,55195.222,15.3 h,IMPRACTICAL
|
|
||||||
JSON-LD,q3,600,39673.993,11.0 h,IMPRACTICAL
|
|
||||||
JSON-LD,q3,1200,79347.876,22.0 h,IMPRACTICAL
|
|
||||||
JSON-LD,q3,6000,396738.933,4.6 d,FAIL
|
|
||||||
JSON-LD,q4,600,39597.306,11.0 h,IMPRACTICAL
|
|
||||||
JSON-LD,q4,1200,79194.5,22.0 h,IMPRACTICAL
|
|
||||||
JSON-LD,q4,6000,395972.054,4.6 d,FAIL
|
|
||||||
JSON-LD,q5,600,39760.772,11.0 h,IMPRACTICAL
|
|
||||||
JSON-LD,q5,1200,79521.432,22.1 h,IMPRACTICAL
|
|
||||||
JSON-LD,q5,6000,397606.717,4.6 d,FAIL
|
|
||||||
JSON-LD,q6,600,39076.231,10.9 h,IMPRACTICAL
|
|
||||||
JSON-LD,q6,1200,78152.351,21.7 h,IMPRACTICAL
|
|
||||||
JSON-LD,q6,6000,390761.312,4.5 d,FAIL
|
|
||||||
JSON-LD,q7,600,40228.164,11.2 h,IMPRACTICAL
|
|
||||||
JSON-LD,q7,1200,80456.218,22.3 h,IMPRACTICAL
|
|
||||||
JSON-LD,q7,6000,402280.643,4.7 d,FAIL
|
|
||||||
SQLite,q1,600,0.062,0.06 s,OK
|
|
||||||
SQLite,q1,1200,0.063,0.06 s,OK
|
|
||||||
SQLite,q1,6000,0.063,0.06 s,OK
|
|
||||||
SQLite,q2,600,1.271,1.27 s,OK
|
|
||||||
SQLite,q2,1200,2.482,2.48 s,OK
|
|
||||||
SQLite,q2,6000,12.169,12 s,OK
|
|
||||||
SQLite,q3,600,339.238,5.7 min,OK
|
|
||||||
SQLite,q3,1200,699.328,11.7 min,OK
|
|
||||||
SQLite,q3,6000,3739.195,62.3 min,IMPRACTICAL
|
|
||||||
SQLite,q4,600,0.06,0.06 s,OK
|
|
||||||
SQLite,q4,1200,0.06,0.06 s,OK
|
|
||||||
SQLite,q4,6000,0.06,0.06 s,OK
|
|
||||||
SQLite,q5,600,2847.603,47.5 min,OK
|
|
||||||
SQLite,q5,1200,5695.146,94.9 min,IMPRACTICAL
|
|
||||||
SQLite,q5,6000,28475.49,7.9 h,IMPRACTICAL
|
|
||||||
SQLite,q6,600,5.18,5.18 s,OK
|
|
||||||
SQLite,q6,1200,10.615,11 s,OK
|
|
||||||
SQLite,q6,6000,56.5,56 s,OK
|
|
||||||
SQLite,q7,600,2619.558,43.7 min,OK
|
|
||||||
SQLite,q7,1200,5239.055,87.3 min,IMPRACTICAL
|
|
||||||
SQLite,q7,6000,26195.034,7.3 h,IMPRACTICAL
|
|
||||||
PostgreSQL,q1,600,0.222,0.22 s,OK
|
|
||||||
PostgreSQL,q1,1200,0.222,0.22 s,OK
|
|
||||||
PostgreSQL,q1,6000,0.222,0.22 s,OK
|
|
||||||
PostgreSQL,q2,600,0.221,0.22 s,OK
|
|
||||||
PostgreSQL,q2,1200,0.221,0.22 s,OK
|
|
||||||
PostgreSQL,q2,6000,0.221,0.22 s,OK
|
|
||||||
PostgreSQL,q3,600,3.42,3.42 s,OK
|
|
||||||
PostgreSQL,q3,1200,6.817,6.82 s,OK
|
|
||||||
PostgreSQL,q3,6000,35.495,35 s,OK
|
|
||||||
PostgreSQL,q4,600,10.715,11 s,OK
|
|
||||||
PostgreSQL,q4,1200,21.209,21 s,OK
|
|
||||||
PostgreSQL,q4,6000,105.162,105 s,OK
|
|
||||||
PostgreSQL,q5,600,222.111,3.7 min,OK
|
|
||||||
PostgreSQL,q5,1200,444.001,7.4 min,OK
|
|
||||||
PostgreSQL,q5,6000,2219.125,37.0 min,OK
|
|
||||||
PostgreSQL,q6,600,4.06,4.06 s,OK
|
|
||||||
PostgreSQL,q6,1200,8.137,8.14 s,OK
|
|
||||||
PostgreSQL,q6,6000,42.55,43 s,OK
|
|
||||||
PostgreSQL,q7,600,114.849,115 s,OK
|
|
||||||
PostgreSQL,q7,1200,229.477,3.8 min,OK
|
|
||||||
PostgreSQL,q7,6000,1146.503,19.1 min,OK
|
|
||||||
RDF triplestore,q1,600,0.113,0.11 s,OK
|
|
||||||
RDF triplestore,q1,1200,0.113,0.11 s,OK
|
|
||||||
RDF triplestore,q1,6000,0.113,0.11 s,OK
|
|
||||||
RDF triplestore,q2,600,10866.789,3.0 h,IMPRACTICAL
|
|
||||||
RDF triplestore,q2,1200,21733.465,6.0 h,IMPRACTICAL
|
|
||||||
RDF triplestore,q2,6000,108666.874,30.2 h,FAIL
|
|
||||||
RDF triplestore,q3,600,185722.881,2.1 d,FAIL
|
|
||||||
RDF triplestore,q3,1200,371445.649,4.3 d,FAIL
|
|
||||||
RDF triplestore,q3,6000,1857227.792,21.5 d,FAIL
|
|
||||||
RDF triplestore,q4,600,79559.375,22.1 h,IMPRACTICAL
|
|
||||||
RDF triplestore,q4,1200,159118.636,44.2 h,FAIL
|
|
||||||
RDF triplestore,q4,6000,795592.727,9.2 d,FAIL
|
|
||||||
RDF triplestore,q5,600,240054.647,2.8 d,FAIL
|
|
||||||
RDF triplestore,q5,1200,480109.181,5.6 d,FAIL
|
|
||||||
RDF triplestore,q5,6000,2400545.453,27.8 d,FAIL
|
|
||||||
RDF triplestore,q6,600,352.729,5.9 min,OK
|
|
||||||
RDF triplestore,q6,1200,727.088,12.1 min,OK
|
|
||||||
RDF triplestore,q6,6000,3887.402,64.8 min,IMPRACTICAL
|
|
||||||
RDF triplestore,q7,600,163225.475,45.3 h,FAIL
|
|
||||||
RDF triplestore,q7,1200,326450.837,3.8 d,FAIL
|
|
||||||
RDF triplestore,q7,6000,1632253.733,18.9 d,FAIL
|
|
||||||
|
@@ -1,16 +0,0 @@
|
|||||||
format,scale_gb,configuration,disk_tb,ram_gb,cores,nodes,ram_modules,nvme_drives,base_usd,ram_usd,disk_usd,extra_nodes_usd,est_cost_usd
|
|
||||||
CSV,600,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,0.78,16.0,16,1,1,1,4618,1887,3995,0,10500
|
|
||||||
CSV,1200,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,1.56,16.0,16,1,1,1,4618,1887,3995,0,10500
|
|
||||||
CSV,6000,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 2 x 7.68 TB NVMe U.2,7.8,16.0,16,1,1,2,4618,1887,7990,0,14495
|
|
||||||
JSON-LD,600,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,1.633,16.0,16,1,1,1,4618,1887,3995,0,10500
|
|
||||||
JSON-LD,1200,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,3.267,16.0,16,1,1,1,4618,1887,3995,0,10500
|
|
||||||
JSON-LD,6000,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 3 x 7.68 TB NVMe U.2,16.334,16.0,16,1,1,3,4618,1887,11985,0,18490
|
|
||||||
SQLite,600,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,0.647,21.0,16,1,1,1,4618,1887,3995,0,10500
|
|
||||||
SQLite,1200,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,1.295,38.0,16,1,1,1,4618,1887,3995,0,10500
|
|
||||||
SQLite,6000,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 3 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,6.475,173.9,16,1,3,1,4618,5661,3995,0,14274
|
|
||||||
PostgreSQL,600,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,2.086,58.7,16,1,1,1,4618,1887,3995,0,10500
|
|
||||||
PostgreSQL,1200,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 2 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,4.171,113.5,16,1,2,1,4618,3774,3995,0,12387
|
|
||||||
PostgreSQL,6000,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 9 x 64 GB DDR5 ECC RDIMM; 3 x 7.68 TB NVMe U.2,20.855,551.3,16,1,9,3,4618,16983,11985,0,33586
|
|
||||||
RDF triplestore,600,2 x 1U Supermicro AS-1015CS-TNR (16 cores); 22 x 64 GB DDR5 ECC RDIMM; 2 x 7.68 TB NVMe U.2,9.127,1404.1,16,2,22,2,4618,41514,7990,4618,58740
|
|
||||||
RDF triplestore,1200,3 x 1U Supermicro AS-1015CS-TNR (16 cores); 44 x 64 GB DDR5 ECC RDIMM; 3 x 7.68 TB NVMe U.2,18.254,2808.3,16,3,44,3,4618,83028,11985,9236,108867
|
|
||||||
RDF triplestore,6000,14 x 1U Supermicro AS-1015CS-TNR (16 cores); 220 x 64 GB DDR5 ECC RDIMM; 12 x 7.68 TB NVMe U.2,91.268,14041.3,16,14,220,12,4618,415140,47940,60034,527732
|
|
||||||
|
21
report.py
21
report.py
@@ -3,9 +3,8 @@
|
|||||||
Aggregates the measured matrix (task 09), the projections (task 10) and the
|
Aggregates the measured matrix (task 09), the projections (task 10) and the
|
||||||
process diagrams (task 02) into the final decision document. Writes 14 PNG
|
process diagrams (task 02) into the final decision document. Writes 14 PNG
|
||||||
charts (150 dpi) under ./out/report/charts/ with the exact names fixed in
|
charts (150 dpi) under ./out/report/charts/ with the exact names fixed in
|
||||||
README.md, seven CSV tables under ./out/report/tables/ (t6/t7 carry every
|
README.md, five CSV tables under ./out/report/tables/, and
|
||||||
projection and hardware row for all three scales - they are the committed
|
./out/report/REPORT.md.
|
||||||
proof artifacts the executive summary links to), and ./out/report/REPORT.md.
|
|
||||||
|
|
||||||
Chart readability contract (owner feedback 2026-07-11): linear scales with
|
Chart readability contract (owner feedback 2026-07-11): linear scales with
|
||||||
actual units everywhere (panels instead of log axes when magnitudes clash),
|
actual units everywhere (panels instead of log axes when magnitudes clash),
|
||||||
@@ -637,22 +636,6 @@ def main() -> int:
|
|||||||
money(sizing[(fmt, REPORT_SCALE_GB)]["est_cost_usd"])] for fmt in FORMATS],
|
money(sizing[(fmt, REPORT_SCALE_GB)]["est_cost_usd"])] for fmt in FORMATS],
|
||||||
)
|
)
|
||||||
|
|
||||||
tables["t6_projected_all_scales"] = (
|
|
||||||
["format", "query", "scale_gb", "projected_wall_s", "projected_wall", "flag"],
|
|
||||||
[[FMT_NAMES[fmt], f"q{qn}", s, proj[(fmt, qn, s)][0], human_time(proj[(fmt, qn, s)][0]), proj[(fmt, qn, s)][1]]
|
|
||||||
for fmt in FORMATS for qn in QUERY_NUMBERS for s in SCALES_GB],
|
|
||||||
)
|
|
||||||
tables["t7_hardware_all_scales"] = (
|
|
||||||
["format", "scale_gb", "configuration", "disk_tb", "ram_gb", "cores", "nodes",
|
|
||||||
"ram_modules", "nvme_drives", "base_usd", "ram_usd", "disk_usd", "extra_nodes_usd", "est_cost_usd"],
|
|
||||||
[[FMT_NAMES[fmt], s, config_string(sizing[(fmt, s)], prices),
|
|
||||||
sizing[(fmt, s)]["disk_tb"], sizing[(fmt, s)]["ram_gb"],
|
|
||||||
sizing[(fmt, s)]["cores"], sizing[(fmt, s)]["nodes"],
|
|
||||||
sizing[(fmt, s)]["ram_modules"], sizing[(fmt, s)]["nvme_drives"],
|
|
||||||
round(sizing[(fmt, s)]["base_usd"]), round(sizing[(fmt, s)]["ram_usd"]),
|
|
||||||
round(sizing[(fmt, s)]["disk_usd"]), round(sizing[(fmt, s)]["extra_nodes_usd"]),
|
|
||||||
round(sizing[(fmt, s)]["est_cost_usd"])] for fmt in FORMATS for s in SCALES_GB],
|
|
||||||
)
|
|
||||||
scoreboards = build_scoreboards(medians, proj, sizes, sizing)
|
scoreboards = build_scoreboards(medians, proj, sizes, sizing)
|
||||||
tables["t5_weighted_scores"] = (
|
tables["t5_weighted_scores"] = (
|
||||||
["scale", "format", "search_pts", "ram_pts", "disk_pts", "total"],
|
["scale", "format", "search_pts", "ram_pts", "disk_pts", "total"],
|
||||||
|
|||||||
Reference in New Issue
Block a user