feat(database): reimplement parallelization in batching (#15)

<!-- greptile_comment -->

<h3>Greptile Summary</h3>


This PR reimplements parallelization across all five database processing modules (`flow_db.py`, `ip_db.py`, `protocol_db.py`, `spectrum_db.py`, `structure_db.py`) by introducing a consistent worker-batch pattern that separates file processing from database operations.

**Key changes:**
- Refactored each module to use `multiprocessing.Pool` with configurable `MAX_WORKERS` and `BATCH_SIZE`
- Separated processing logic into `process_file_worker()` functions that run without DB connections
- Consolidated DB operations into `batch_insert_results()` functions that handle transaction commits per batch
- Added new `batch_mark_processed()` function in `discovery.py` for batch status updates
- Removed unused `aggregate_buckets()` functions from `ip_db.py` and `protocol_db.py`
- Changed `compute_spectrum()` and `compute_structure_function()` signatures to accept lists instead of sets

**Performance improvements:**
- Parallel processing of files within batches using process pools
- Batch database commits reduce transaction overhead
- Improved logging with batch progress indicators and table name prefixes

<h3>Confidence Score: 5/5</h3>


- This PR is safe to merge with minimal risk
- The refactoring follows a consistent pattern across all modules, properly separates concerns between processing and database operations, and maintains backward compatibility. The code uses validated parameters and proper error handling throughout.
- No files require special attention

<h3>Important Files Changed</h3>




| Filename | Overview |
|----------|----------|
| netflow-db/discovery.py | Added `batch_mark_processed` function for batch status updates; uses validated table names with f-string interpolation for column names |
| netflow-db/flow_db.py | Refactored to use multiprocessing with worker/batch pattern; processing logic separated from DB operations |
| netflow-db/ip_db.py | Refactored to parallel batch processing; removed unused `aggregate_buckets` function |
| netflow-db/protocol_db.py | Refactored to parallel batch processing; removed unused `aggregate_buckets` function |
| netflow-db/spectrum_db.py | Refactored to parallel batch processing with worker pattern; `compute_spectrum` now accepts list instead of set |
| netflow-db/structure_db.py | Refactored to parallel batch processing with worker pattern; `compute_structure_function` now accepts list instead of set |

</details>



<h3>Sequence Diagram</h3>

```mermaid
sequenceDiagram
    participant Main as process_pending_files()
    participant Pool as Multiprocessing Pool
    participant Worker as process_file_worker()
    participant Batch as batch_insert_results()
    participant Mark as batch_mark_processed()
    participant DB as SQLite Database
    
    Main->>DB: get_files_needing_processing()
    DB-->>Main: pending files list
    
    loop For each batch (BATCH_SIZE)
        Main->>Pool: Create Pool(MAX_WORKERS)
        Pool->>Worker: Map tasks to workers (parallel)
        
        par Parallel Processing
            Worker->>Worker: Extract file_path, router, timestamp
            Worker->>Worker: Check if file exists
            alt File exists
                Worker->>Worker: Run nfdump/subprocess
                Worker->>Worker: Parse output
                Worker-->>Pool: Return result (success, data)
            else File missing (gap)
                Worker->>Worker: Create zero/empty data
                Worker-->>Pool: Return result (success, placeholder)
            end
        end
        
        Pool-->>Main: Batch results
        Main->>Batch: batch_insert_results(conn, results)
        
        loop For each successful result
            Batch->>DB: INSERT OR REPLACE stats
        end
        Batch->>DB: commit()
        
        Main->>Mark: batch_mark_processed(conn, table_name, results)
        
        loop For each result
            Mark->>DB: UPDATE processed_files SET status
        end
        Mark->>DB: UPDATE processed_at (fully processed files)
        Mark->>DB: commit()
        
        Main->>Main: Update stats counters
    end
    
    Main-->>Main: Return stats
```

<!-- greptile_other_comments_section -->

<!-- /greptile_comment -->
16ebb0b541oliver committed on 1/15/2026, 9:40:23 PM· committed by GitHubparents2170a10d5246f2
6 files changedLine totals unavailable