4.4 KiB
4.4 KiB
Module: viz_io
Purpose
The viz_io module provides atomic inter-process communication (IPC) between the data processing pipeline and the visualization frontend. It manages JSON file-based data exchange with atomic writes to prevent race conditions and data corruption.
Public Interface
Functions
add_ohlc_bar(timestamp, open_price, high_price, low_price, close_price, volume): Append new OHLC bar to rolling datasetupsert_ohlc_bar(timestamp, open_price, high_price, low_price, close_price, volume): Update existing bar or append new oneclear_data(): Reset OHLC dataset to empty stateadd_metric_bar(timestamp, obi_open, obi_high, obi_low, obi_close): Append OBI metric barupsert_metric_bar(timestamp, obi_open, obi_high, obi_low, obi_close): Update existing OBI bar or append new oneclear_metrics(): Reset metrics dataset to empty stateset_depth_data(bids, asks): Update current orderbook depth snapshot
Constants
DATA_FILE: Path to OHLC data JSON fileDEPTH_FILE: Path to depth data JSON fileMETRICS_FILE: Path to metrics data JSON fileMAX_BARS: Maximum number of bars to retain (1000)
Usage Examples
Basic OHLC Operations
import viz_io
# Add a new OHLC bar
viz_io.add_ohlc_bar(
timestamp=1640995200000, # Unix timestamp in milliseconds
open_price=50000.0,
high_price=50100.0,
low_price=49900.0,
close_price=50050.0,
volume=125.5
)
# Update the current bar (if timestamp matches) or add new one
viz_io.upsert_ohlc_bar(
timestamp=1640995200000,
open_price=50000.0,
high_price=50150.0, # Updated high
low_price=49850.0, # Updated low
close_price=50075.0, # Updated close
volume=130.2 # Updated volume
)
Orderbook Depth Management
# Set current depth snapshot
bids = [[49990.0, 1.5], [49985.0, 2.1], [49980.0, 0.8]]
asks = [[50010.0, 1.2], [50015.0, 1.8], [50020.0, 2.5]]
viz_io.set_depth_data(bids, asks)
Metrics Operations
# Add Order Book Imbalance metrics
viz_io.add_metric_bar(
timestamp=1640995200000,
obi_open=0.15,
obi_high=0.22,
obi_low=0.08,
obi_close=0.18
)
Dependencies
Internal
- None (standalone utility module)
External
json: JSON serialization/deserializationpathlib: File path handlingtyping: Type annotationstempfile: Atomic write operations
Data Formats
OHLC Data (ohlc_data.json)
[
[1640995200000, 50000.0, 50100.0, 49900.0, 50050.0, 125.5],
[1640995260000, 50050.0, 50200.0, 50000.0, 50150.0, 98.3]
]
Format: [timestamp, open, high, low, close, volume]
Depth Data (depth_data.json)
{
"bids": [[49990.0, 1.5], [49985.0, 2.1]],
"asks": [[50010.0, 1.2], [50015.0, 1.8]]
}
Format: {"bids": [[price, size], ...], "asks": [[price, size], ...]}
Metrics Data (metrics_data.json)
[
[1640995200000, 0.15, 0.22, 0.08, 0.18],
[1640995260000, 0.18, 0.25, 0.12, 0.20]
]
Format: [timestamp, obi_open, obi_high, obi_low, obi_close]
Atomic Write Operations
All write operations use atomic file replacement to prevent partial reads:
- Write data to temporary file
- Flush and sync to disk
- Atomically rename temporary file to target file
This ensures the visualization frontend always reads complete, valid JSON data.
Performance Characteristics
- Bounded Memory: OHLC and metrics datasets limited to 1000 bars max
- Atomic Operations: No partial reads possible during writes
- Rolling Window: Automatic trimming of old data maintains constant memory usage
- Fast Lookups: Timestamp-based upsert operations use list scanning (acceptable for 1000 items)
Testing
Run module tests:
uv run pytest test_viz_io.py -v
Test coverage includes:
- Atomic write operations
- Data format validation
- Rolling window behavior
- Upsert logic correctness
- File corruption prevention
- Concurrent read/write scenarios
Known Issues
- File I/O may block briefly during atomic writes
- JSON parsing errors not propagated to callers
- Limited to 1000 bars maximum (configurable via MAX_BARS)
- No compression for large datasets
Thread Safety
All operations are thread-safe for single writer, multiple reader scenarios:
- Writer: Data processing pipeline (single thread)
- Readers: Visualization frontend (polling)
- Atomic file operations prevent corruption during concurrent access