Parallelize data processing tasks with ThreadPoolExecutor

- Use multi-threading to speed up data ingestion, correlation, and
  entropy
  calculations across bus identifiers
This commit is contained in:
2026-07-22 20:09:08 +02:00
parent 6c198d83c5
commit 2597c9f8a2
3 changed files with 31 additions and 12 deletions
+16 -6
View File
@@ -4,6 +4,7 @@
import os
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor
import polars as pl
import dash
@@ -59,9 +60,10 @@ PRECOMPUTED_FIGURES = {}
DATA_BY_ID = {}
CORR_CACHE = {}
for bus, df in DATA.items():
PRECOMPUTED_FIGURES[f"{bus}_freq"] = plot_frequency(calculate_frequency(df), title=f"{bus} Frequency")
PRECOMPUTED_FIGURES[f"{bus}_entropy"] = plot_entropy_heatmap(calculate_byte_entropy(df), title=f"{bus} Byte-Level Entropy")
def process_bus_data(bus, df):
precomp = {}
precomp[f"{bus}_freq"] = plot_frequency(calculate_frequency(df), title=f"{bus} Frequency")
precomp[f"{bus}_entropy"] = plot_entropy_heatmap(calculate_byte_entropy(df), title=f"{bus} Byte-Level Entropy")
can_id_col = 'ID' if 'ID' in df.columns else 'Identifier'
formatted = _format_can_id_vec(df[can_id_col])
@@ -80,13 +82,21 @@ for bus, df in DATA.items():
group = group.iloc[keep]
grouped[can_id] = (group, byte_cols)
DATA_BY_ID[bus] = grouped
return precomp, grouped
with ThreadPoolExecutor() as executor:
futures = {executor.submit(process_bus_data, bus, df): bus for bus, df in DATA.items()}
for future in futures:
bus = futures[future]
precomp, grouped = future.result()
PRECOMPUTED_FIGURES.update(precomp)
DATA_BY_ID[bus] = grouped
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.config.suppress_callback_exceptions = True
app.layout = dbc.Container([
html.H1("CANveyor", className="my-4"),
html.H1("CAN Bus Analyzer", className="my-4"),
dbc.Tabs([
dbc.Tab(label="Overview", tab_id="overview", children=[
html.Div(id="overview-content")
@@ -209,4 +219,4 @@ def update_corr(method, target, bus, tab):
return plot_correlation_heatmap(corr_df, target_id=target_id, title=title)
if __name__ == '__main__':
app.run(debug=False)
app.run(debug=True)