Remote Execution with ras-commander¶
This notebook demonstrates how to execute HEC-RAS plans using:
1. Local parallel execution - RasCmdr.compute_parallel() on your local machine
2. Remote execution - compute_parallel_remote() on remote machines via PsExec/Docker
Features¶
- Distributed execution across multiple remote machines
- Automatic project deployment via network shares
- Parallel execution with configurable workers
- Result collection and consolidation
- Automatic PsExec.exe download (no manual setup required)
Requirements for Remote Execution¶
- Remote machine(s) configured per
REMOTE_WORKER_SETUP_GUIDE.md - Network share accessible from control machine
- HEC-RAS installed on remote machine(s)
Critical Configuration Requirements¶
IMPORTANT: Remote HEC-RAS execution requires session-based execution. Never use system_account=True.
Required on Remote Machine:
1. Session ID Configuration: Typically session_id=2 for interactive sessions
- Query session: query session /server:HOSTNAME to find correct ID
2. Group Policy Rights (on remote machine):
- Access this computer from the network
- Allow log on locally
- Log on as a batch job
3. Registry Setting: LocalAccountTokenFilterPolicy=1
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" `
-Name "LocalAccountTokenFilterPolicy" -Value 1 -PropertyType DWORD -Force
Why This Matters: HEC-RAS is a GUI application and will fail silently if executed in system account context.
Reference Documentation¶
- ras-commander Remote Execution:
.claude/rules/hec-ras/remote.md(critical configuration patterns) - Worker Setup Guide:
feature_dev_notes/RasRemote/REMOTE_WORKER_SETUP_GUIDE.md - HEC-RAS System Requirements: HEC-RAS Downloads
Security Considerations¶
- Network Share Access: Ensure proper permissions and consider encryption for sensitive models
- Credential Management: Use secure credential storage (not hardcoded passwords)
- Firewall Rules: Remote execution requires SMB (port 445) and RPC access
- Audit Trail: All remote executions are logged for review
Part 1: Setup and Imports¶
# =============================================================================
# DEVELOPMENT MODE TOGGLE
# =============================================================================
from pathlib import Path # Import Path unconditionally
import os
import time
USE_LOCAL_SOURCE = False # <-- TOGGLE THIS
if USE_LOCAL_SOURCE:
import sys
local_path = str(Path.cwd().parent)
if local_path not in sys.path:
sys.path.insert(0, local_path)
print(f"📁 LOCAL SOURCE MODE: Loading from {local_path}/ras_commander")
else:
print("📦 PIP PACKAGE MODE: Loading installed ras-commander")
# Import ras-commander core functionality
from ras_commander import HdfResultsPlan, RasCmdr, RasExamples, init_ras_project, ras
# Import remote execution functions (lazy loaded)
from ras_commander import load_workers_from_json, compute_parallel_remote
# Verify which version loaded
import ras_commander
print(f"✓ Loaded: {ras_commander.__file__}")
📦 PIP PACKAGE MODE: Loading installed ras-commander
✓ Loaded: c:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\ras_commander\__init__.py
# Display results summary from results_df
desired_cols = ['plan_number', 'plan_title', 'completed', 'has_errors', 'has_warnings', 'runtime_complete_process_hours']
available_cols = [c for c in desired_cols if c in ras.results_df.columns]
ras.results_df[available_cols]
Parameters¶
Configure these values to customize the notebook for your project.
# =============================================================================
# PARAMETERS - Edit these to customize the notebook
# =============================================================================
from pathlib import Path
# Project Configuration
PROJECT_NAME = "BaldEagleCrkMulti2D" # Example project to extract
RAS_VERSION = "7.0" # HEC-RAS version (6.3, 6.5, 6.6, etc.)
# Remote Execution Settings
REMOTE_HOST = "192.168.1.100" # Remote machine hostname/IP
REMOTE_USER = "ras_user" # Username on remote machine
SESSION_ID = 2 # Windows session ID (typically 2)
REMOTE_SHARE = r"\\{host}\RAS_Share" # UNC path to shared folder
print(f"Configuration: {PROJECT_NAME} project, RAS {RAS_VERSION}")
Configuration: BaldEagleCrkMulti2D project, RAS 6.6
# Extract example project for testing
project_path = RasExamples.extract_project(PROJECT_NAME, suffix="500")
print(f"Project extracted to: {project_path}")
# Initialize project
ras = init_ras_project(project_path, RAS_VERSION)
print(f"\nProject: {ras.project_name}")
print(f"Available plans: {list(ras.plan_df['plan_number'])}")
2025-12-29 06:06:33 - ras_commander.RasExamples - INFO - Found zip file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\Example_Projects_6_6.zip
2025-12-29 06:06:33 - ras_commander.RasExamples - INFO - Loading project data from CSV...
2025-12-29 06:06:33 - ras_commander.RasExamples - INFO - Loaded 68 projects from CSV.
2025-12-29 06:06:33 - ras_commander.RasExamples - INFO - ----- RasExamples Extracting Project -----
2025-12-29 06:06:33 - ras_commander.RasExamples - INFO - Extracting project 'BaldEagleCrkMulti2D' as 'BaldEagleCrkMulti2D_500'
2025-12-29 06:06:33 - ras_commander.RasExamples - INFO - Folder 'BaldEagleCrkMulti2D_500' already exists. Deleting existing folder...
2025-12-29 06:06:33 - ras_commander.RasExamples - INFO - Existing folder 'BaldEagleCrkMulti2D_500' has been deleted.
2025-12-29 06:06:36 - ras_commander.RasExamples - INFO - Successfully extracted project 'BaldEagleCrkMulti2D' to C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500
2025-12-29 06:06:36 - ras_commander.rasmap - INFO - Successfully parsed RASMapper file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.rasmap
Project extracted to: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500
Project: BaldEagleDamBrk
Available plans: ['13', '15', '17', '18', '19', '03', '04', '02', '01', '05', '06']
Part 2: Local Parallel Execution¶
Use RasCmdr.compute_parallel() to run multiple plans on your local machine.
This is the simplest way to parallelize HEC-RAS execution.
LOCAL_PLANS = ["03", "04", "06"] # Plans to execute
LOCAL_MAX_WORKERS = 3 # Number of parallel processes
LOCAL_NUM_CORES = 2 # Cores per HEC-RAS instance
print(f"Plans to execute: {LOCAL_PLANS}")
print(f"Configuration: {LOCAL_NUM_CORES} cores x {LOCAL_MAX_WORKERS} workers")
Plans to execute: ['03', '04', '06']
Configuration: 2 cores x 3 workers
print(f"Starting LOCAL parallel execution of {len(LOCAL_PLANS)} plans...")
print("="*70)
start_time = time.time()
local_results = RasCmdr.compute_parallel(
plan_number=LOCAL_PLANS,
max_workers=LOCAL_MAX_WORKERS,
num_cores=LOCAL_NUM_CORES,
ras_object=ras,
overwrite_dest=True
)
elapsed = time.time() - start_time
print(f"\nExecution complete in {elapsed:.1f} seconds ({elapsed/60:.1f} minutes)")
2025-12-29 06:06:36 - ras_commander.RasCmdr - INFO - Filtered plans to execute: ['03', '04', '06']
2025-12-29 06:06:36 - ras_commander.RasCmdr - INFO - Adjusted max_workers to 3 based on the number of plans to compute: 3
Starting LOCAL parallel execution of 3 plans...
======================================================================
2025-12-29 06:06:36 - ras_commander.RasCmdr - INFO - Created worker folder: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 1]
2025-12-29 06:06:36 - ras_commander.rasmap - INFO - Successfully parsed RASMapper file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 1]\BaldEagleDamBrk.rasmap
2025-12-29 06:06:36 - ras_commander.RasCmdr - INFO - Created worker folder: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 2]
2025-12-29 06:06:36 - ras_commander.rasmap - INFO - Successfully parsed RASMapper file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 2]\BaldEagleDamBrk.rasmap
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Created worker folder: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 3]
2025-12-29 06:06:37 - ras_commander.rasmap - INFO - Successfully parsed RASMapper file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 3]\BaldEagleDamBrk.rasmap
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Using ras_object with project folder: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 1]
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Using ras_object with project folder: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 2]
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Using ras_object with project folder: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 3]
2025-12-29 06:06:37 - ras_commander.RasUtils - INFO - Using provided plan file path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 1]\BaldEagleDamBrk.p03
2025-12-29 06:06:37 - ras_commander.RasUtils - INFO - Successfully updated file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 1]\BaldEagleDamBrk.p03
2025-12-29 06:06:37 - ras_commander.RasUtils - INFO - Using provided plan file path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 2]\BaldEagleDamBrk.p04
2025-12-29 06:06:37 - ras_commander.RasUtils - INFO - Successfully updated file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 2]\BaldEagleDamBrk.p04
2025-12-29 06:06:37 - ras_commander.RasUtils - INFO - Using provided plan file path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 3]\BaldEagleDamBrk.p06
2025-12-29 06:06:37 - ras_commander.RasUtils - INFO - Successfully updated file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 3]\BaldEagleDamBrk.p06
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Set number of cores to 2 for plan: 03
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Running HEC-RAS from the Command Line:
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Running command: "C:\Program Files (x86)\HEC\HEC-RAS\6.6\Ras.exe" -c "C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 1]\BaldEagleDamBrk.prj" "C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 1]\BaldEagleDamBrk.p03"
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Set number of cores to 2 for plan: 04
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Running HEC-RAS from the Command Line:
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Running command: "C:\Program Files (x86)\HEC\HEC-RAS\6.6\Ras.exe" -c "C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 2]\BaldEagleDamBrk.prj" "C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 2]\BaldEagleDamBrk.p04"
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Set number of cores to 2 for plan: 06
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Running HEC-RAS from the Command Line:
2025-12-29 06:06:37 - ras_commander.RasCmdr - INFO - Running command: "C:\Program Files (x86)\HEC\HEC-RAS\6.6\Ras.exe" -c "C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 3]\BaldEagleDamBrk.prj" "C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Worker 3]\BaldEagleDamBrk.p06"
2025-12-29 06:18:56 - ras_commander.RasCmdr - INFO - HEC-RAS execution completed for plan: 03
2025-12-29 06:18:56 - ras_commander.RasCmdr - INFO - Total run time for plan 03: 739.49 seconds
2025-12-29 06:18:56 - ras_commander.RasCmdr - INFO - Plan 03 executed in worker 1: Successful
2025-12-29 06:19:40 - ras_commander.RasCmdr - INFO - HEC-RAS execution completed for plan: 04
2025-12-29 06:19:40 - ras_commander.RasCmdr - INFO - Total run time for plan 04: 782.92 seconds
2025-12-29 06:19:40 - ras_commander.RasCmdr - INFO - Plan 04 executed in worker 2: Successful
2025-12-29 06:21:24 - ras_commander.RasCmdr - INFO - HEC-RAS execution completed for plan: 06
2025-12-29 06:21:24 - ras_commander.RasCmdr - INFO - Total run time for plan 06: 886.93 seconds
2025-12-29 06:21:24 - ras_commander.RasCmdr - INFO - Plan 06 executed in worker 3: Successful
2025-12-29 06:21:24 - ras_commander.RasCmdr - INFO - Final destination for computed results: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Computed]
2025-12-29 06:21:32 - ras_commander.rasmap - INFO - Successfully parsed RASMapper file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Computed]\BaldEagleDamBrk.rasmap
2025-12-29 06:21:32 - ras_commander.RasCmdr - INFO -
Execution Results:
2025-12-29 06:21:32 - ras_commander.RasCmdr - INFO - Plan 03: Successful
2025-12-29 06:21:32 - ras_commander.RasCmdr - INFO - Plan 04: Successful
2025-12-29 06:21:32 - ras_commander.RasCmdr - INFO - Plan 06: Successful
Execution complete in 896.1 seconds (14.9 minutes)
# Display results summary from results_df
desired_cols = ['plan_number', 'plan_title', 'completed', 'has_errors', 'has_warnings', 'runtime_complete_process_hours']
available_cols = [c for c in desired_cols if c in ras.results_df.columns]
ras.results_df[available_cols]
print("LOCAL Execution Results:")
print("="*70)
success_count = sum(1 for success in local_results.values() if success)
fail_count = len(local_results) - success_count
for plan_num, success in local_results.items():
status = "SUCCESS" if success else "FAILED"
print(f" Plan {plan_num}: {status}")
print(f"\nSummary: {success_count}/{len(local_results)} plans succeeded")
print(f"Results folder: {ras.project_folder.parent / (ras.project_folder.name + ' [Computed]')}")
LOCAL Execution Results:
======================================================================
Plan 03: SUCCESS
Plan 04: SUCCESS
Plan 06: SUCCESS
Summary: 3/3 plans succeeded
Results folder: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500 [Computed]
Part 3: Remote Execution Setup¶
To use remote execution, you need to configure remote workers.
First Time Setup¶
- Copy
RemoteWorkers.json.templatetoRemoteWorkers.json - Edit
RemoteWorkers.jsonwith your remote machine details - The JSON file is in
.gitignorefor security
Worker Types¶
- local - Execute on local machine (useful for mixed local+remote)
- psexec - Execute on remote Windows via PsExec
- docker - Execute in Docker container (local or remote via SSH)
JSON Configuration Example¶
{
"workers": [
{
"name": "Local Worker",
"worker_type": "local",
"worker_folder": "C:\\RasRemote",
"cores_total": 8,
"cores_per_plan": 2,
"enabled": true
},
{
"name": "Remote Workstation",
"worker_type": "psexec",
"hostname": "192.168.1.100",
"share_path": "\\\\192.168.1.100\\RasRemote",
"worker_folder": "C:\\RasRemote",
"username": "your_username",
"password": "your_password",
"session_id": 2,
"cores_total": 16,
"cores_per_plan": 4,
"enabled": true
}
]
}
# Check if RemoteWorkers.json exists
config_file = Path("RemoteWorkers.json")
if not config_file.exists():
print("WARNING: RemoteWorkers.json not found!")
print()
print("To use remote execution:")
print("1. Copy RemoteWorkers.json.template to RemoteWorkers.json")
print("2. Edit RemoteWorkers.json with your remote machine details")
print("3. Re-run this cell")
print()
print("For now, you can still use LOCAL parallel execution (Part 2 above).")
REMOTE_AVAILABLE = False
else:
import json
with open(config_file, 'r') as f:
worker_configs = json.load(f)
enabled_configs = [w for w in worker_configs["workers"] if w.get("enabled", True)]
print(f"Found {len(enabled_configs)} enabled worker(s) in RemoteWorkers.json:")
for w in enabled_configs:
cores_total = w.get('cores_total', 'Not set')
cores_per_plan = w.get('cores_per_plan', 4)
print(f" - {w.get('name', 'unnamed')} ({w.get('worker_type', 'unknown')})")
print(f" Cores: {cores_total} total, {cores_per_plan} per plan")
REMOTE_AVAILABLE = True
Found 3 enabled worker(s) in RemoteWorkers.json:
- CLB-04 (psexec)
Cores: 8 total, 2 per plan
- Local Compute (local)
Cores: 8 total, 2 per plan
- CLB-04 Docker 6.6 (docker)
Cores: 4 total, 4 per plan
Part 4: Remote Parallel Execution¶
Use compute_parallel_remote() to run plans on remote machines.
Key differences from local execution: - Plans are copied to remote shares - Execution happens on remote machines - Results are collected back to local project - Supports multiple remote workers simultaneously
# Load remote workers from JSON
# NOTE: This must be called AFTER init_ras_project() so ras_exe_path is available
if REMOTE_AVAILABLE:
workers = load_workers_from_json("RemoteWorkers.json")
print(f"Loaded {len(workers)} worker(s):")
for w in workers:
print(f" - {w.worker_id} ({w.worker_type})")
if hasattr(w, 'max_parallel_plans') and w.max_parallel_plans > 1:
print(f" Parallel Capacity: {w.max_parallel_plans} plans")
else:
print("Remote workers not available - configure RemoteWorkers.json first")
workers = []
2025-12-29 06:21:32 - ras_commander.remote.RasWorker - INFO - Initializing psexec worker
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - Initializing PsExec worker for 192.168.3.8
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - PsExec worker configured:
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - Hostname: 192.168.3.8
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - Share path: \\192.168.3.8\RasRemote
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - Worker folder: C:\RasRemote
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - User: .\bill
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - System account: False
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - Session ID: 2
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - Process Priority: low
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - INFO - Queue Priority: 1
2025-12-29 06:21:32 - ras_commander.remote.PsexecWorker - WARNING - Validation deferred - share access and remote execution will be tested during actual plan execution
2025-12-29 06:21:32 - ras_commander.remote.RasWorker - INFO - Loaded worker: CLB-04 (psexec)
2025-12-29 06:21:32 - ras_commander.remote.RasWorker - INFO - Initializing local worker
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Initializing local worker
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Local worker configured:
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Worker folder: C:\RasRemote
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - RAS Exe: C:\Program Files (x86)\HEC\HEC-RAS\6.6\Ras.exe
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Process Priority: low
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Queue Priority: 0
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Parallel Capacity: 4 plans simultaneously
2025-12-29 06:21:32 - ras_commander.remote.RasWorker - INFO - Loaded worker: Local Compute (local)
2025-12-29 06:21:32 - ras_commander.remote.RasWorker - INFO - Initializing docker worker
2025-12-29 06:21:32 - ras_commander.remote.DockerWorker - INFO - Using system ssh client for Docker connection
2025-12-29 06:21:32 - ras_commander.remote.RasWorker - ERROR - Failed to initialize worker 'CLB-04 Docker 6.6': SSH connection failed - paramiko issue: Install paramiko package to enable ssh:// support
Install paramiko: pip install paramiko
Or set use_ssh_client=True in your worker config
2025-12-29 06:21:32 - ras_commander.remote.RasWorker - INFO - Loaded 2 workers from RemoteWorkers.json
Loaded 2 worker(s):
- CLB-04 (psexec)
Parallel Capacity: 4 plans
- Local Compute (local)
Parallel Capacity: 4 plans
# Configuration for remote execution
REMOTE_PLANS = ["03", "04", "06"] # Plans to execute remotely
REMOTE_NUM_CORES = 4 # Cores per HEC-RAS instance
print(f"Plans to execute: {REMOTE_PLANS}")
print(f"Workers available: {len(workers)}")
Plans to execute: ['03', '04', '06']
Workers available: 2
# Execute plans on REMOTE workers
if workers:
print(f"Starting REMOTE execution of {len(REMOTE_PLANS)} plans...")
print(f"Using {len(workers)} worker(s)")
print("="*70)
start_time = time.time()
remote_results = compute_parallel_remote(
plan_numbers=REMOTE_PLANS,
workers=workers,
num_cores=REMOTE_NUM_CORES,
autoclean=True # Delete temp folders after execution (default)
)
elapsed = time.time() - start_time
print(f"\nExecution complete in {elapsed:.1f} seconds ({elapsed/60:.1f} minutes)")
else:
print("No remote workers available.")
print("Configure RemoteWorkers.json to enable remote execution.")
remote_results = {}
2025-12-29 06:21:32 - ras_commander.remote.Execution - INFO - Starting distributed execution of 3 plans across 2 workers
Starting REMOTE execution of 3 plans...
Using 2 worker(s)
======================================================================
2025-12-29 06:21:32 - ras_commander.remote.Execution - INFO - Total worker slots available: 8
2025-12-29 06:21:32 - ras_commander.remote.Execution - INFO - Submitting plan 03 to worker Local Compute (sub-worker #1)
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Starting local execution of plan 03 (sub-worker #1)
2025-12-29 06:21:32 - ras_commander.remote.Execution - INFO - Submitting plan 04 to worker Local Compute (sub-worker #2)
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Copying project to C:\RasRemote\BaldEagleDamBrk_03_SW1_140a1b33
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Starting local execution of plan 04 (sub-worker #2)
2025-12-29 06:21:32 - ras_commander.remote.Execution - INFO - Submitting plan 06 to worker Local Compute (sub-worker #3)
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Copying project to C:\RasRemote\BaldEagleDamBrk_04_SW2_4b9689d9
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Starting local execution of plan 06 (sub-worker #3)
2025-12-29 06:21:32 - ras_commander.remote.LocalWorker - INFO - Copying project to C:\RasRemote\BaldEagleDamBrk_06_SW3_3875b0bc
2025-12-29 06:21:33 - ras_commander.remote.LocalWorker - INFO - Initializing project in worker folder
2025-12-29 06:21:33 - ras_commander.remote.LocalWorker - INFO - Initializing project in worker folder
2025-12-29 06:21:33 - ras_commander.remote.LocalWorker - INFO - Initializing project in worker folder
2025-12-29 06:21:33 - ras_commander.rasmap - INFO - Successfully parsed RASMapper file: C:\RasRemote\BaldEagleDamBrk_04_SW2_4b9689d9\BaldEagleDamBrk\BaldEagleDamBrk.rasmap
2025-12-29 06:21:33 - ras_commander.remote.LocalWorker - INFO - Executing plan 04 with RasCmdr.compute_plan()
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Using ras_object with project folder: C:\RasRemote\BaldEagleDamBrk_04_SW2_4b9689d9\BaldEagleDamBrk
2025-12-29 06:21:33 - ras_commander.rasmap - INFO - Successfully parsed RASMapper file: C:\RasRemote\BaldEagleDamBrk_06_SW3_3875b0bc\BaldEagleDamBrk\BaldEagleDamBrk.rasmap
2025-12-29 06:21:33 - ras_commander.remote.LocalWorker - INFO - Executing plan 06 with RasCmdr.compute_plan()
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Using ras_object with project folder: C:\RasRemote\BaldEagleDamBrk_06_SW3_3875b0bc\BaldEagleDamBrk
2025-12-29 06:21:33 - ras_commander.RasUtils - INFO - Using provided plan file path: C:\RasRemote\BaldEagleDamBrk_04_SW2_4b9689d9\BaldEagleDamBrk\BaldEagleDamBrk.p04
2025-12-29 06:21:33 - ras_commander.RasUtils - INFO - Using provided plan file path: C:\RasRemote\BaldEagleDamBrk_06_SW3_3875b0bc\BaldEagleDamBrk\BaldEagleDamBrk.p06
2025-12-29 06:21:33 - ras_commander.rasmap - INFO - Successfully parsed RASMapper file: C:\RasRemote\BaldEagleDamBrk_03_SW1_140a1b33\BaldEagleDamBrk\BaldEagleDamBrk.rasmap
2025-12-29 06:21:33 - ras_commander.RasUtils - INFO - Successfully updated file: C:\RasRemote\BaldEagleDamBrk_04_SW2_4b9689d9\BaldEagleDamBrk\BaldEagleDamBrk.p04
2025-12-29 06:21:33 - ras_commander.remote.LocalWorker - INFO - Executing plan 03 with RasCmdr.compute_plan()
2025-12-29 06:21:33 - ras_commander.RasUtils - INFO - Successfully updated file: C:\RasRemote\BaldEagleDamBrk_06_SW3_3875b0bc\BaldEagleDamBrk\BaldEagleDamBrk.p06
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Using ras_object with project folder: C:\RasRemote\BaldEagleDamBrk_03_SW1_140a1b33\BaldEagleDamBrk
2025-12-29 06:21:33 - ras_commander.RasUtils - INFO - Using provided plan file path: C:\RasRemote\BaldEagleDamBrk_03_SW1_140a1b33\BaldEagleDamBrk\BaldEagleDamBrk.p03
2025-12-29 06:21:33 - ras_commander.RasUtils - INFO - Successfully updated file: C:\RasRemote\BaldEagleDamBrk_03_SW1_140a1b33\BaldEagleDamBrk\BaldEagleDamBrk.p03
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Set number of cores to 4 for plan: 06
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Set number of cores to 4 for plan: 04
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Running HEC-RAS from the Command Line:
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Running HEC-RAS from the Command Line:
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Running command: "C:\Program Files (x86)\HEC\HEC-RAS\6.6\Ras.exe" -c "C:\RasRemote\BaldEagleDamBrk_06_SW3_3875b0bc\BaldEagleDamBrk\BaldEagleDamBrk.prj" "C:\RasRemote\BaldEagleDamBrk_06_SW3_3875b0bc\BaldEagleDamBrk\BaldEagleDamBrk.p06"
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Running command: "C:\Program Files (x86)\HEC\HEC-RAS\6.6\Ras.exe" -c "C:\RasRemote\BaldEagleDamBrk_04_SW2_4b9689d9\BaldEagleDamBrk\BaldEagleDamBrk.prj" "C:\RasRemote\BaldEagleDamBrk_04_SW2_4b9689d9\BaldEagleDamBrk\BaldEagleDamBrk.p04"
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Set number of cores to 4 for plan: 03
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Running HEC-RAS from the Command Line:
2025-12-29 06:21:33 - ras_commander.RasCmdr - INFO - Running command: "C:\Program Files (x86)\HEC\HEC-RAS\6.6\Ras.exe" -c "C:\RasRemote\BaldEagleDamBrk_03_SW1_140a1b33\BaldEagleDamBrk\BaldEagleDamBrk.prj" "C:\RasRemote\BaldEagleDamBrk_03_SW1_140a1b33\BaldEagleDamBrk\BaldEagleDamBrk.p03"
2025-12-29 06:33:52 - ras_commander.RasCmdr - INFO - HEC-RAS execution completed for plan: 03
2025-12-29 06:33:52 - ras_commander.RasCmdr - INFO - Total run time for plan 03: 739.05 seconds
2025-12-29 06:33:52 - ras_commander.remote.LocalWorker - INFO - HDF file created successfully: C:\RasRemote\BaldEagleDamBrk_03_SW1_140a1b33\BaldEagleDamBrk\BaldEagleDamBrk.p03.hdf
2025-12-29 06:33:52 - ras_commander.remote.LocalWorker - INFO - Copied results to C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p03.hdf
2025-12-29 06:33:52 - ras_commander.remote.Execution - INFO - Plan 03 completed successfully (740.1s)
2025-12-29 06:35:39 - ras_commander.RasCmdr - INFO - HEC-RAS execution completed for plan: 06
2025-12-29 06:35:39 - ras_commander.RasCmdr - INFO - Total run time for plan 06: 846.07 seconds
2025-12-29 06:35:39 - ras_commander.remote.LocalWorker - INFO - HDF file created successfully: C:\RasRemote\BaldEagleDamBrk_06_SW3_3875b0bc\BaldEagleDamBrk\BaldEagleDamBrk.p06.hdf
2025-12-29 06:35:40 - ras_commander.remote.LocalWorker - INFO - Copied results to C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p06.hdf
2025-12-29 06:35:40 - ras_commander.remote.Execution - INFO - Plan 06 completed successfully (847.6s)
2025-12-29 06:36:13 - ras_commander.RasCmdr - INFO - HEC-RAS execution completed for plan: 04
2025-12-29 06:36:13 - ras_commander.RasCmdr - INFO - Total run time for plan 04: 879.50 seconds
2025-12-29 06:36:13 - ras_commander.remote.LocalWorker - INFO - HDF file created successfully: C:\RasRemote\BaldEagleDamBrk_04_SW2_4b9689d9\BaldEagleDamBrk\BaldEagleDamBrk.p04.hdf
2025-12-29 06:36:13 - ras_commander.remote.LocalWorker - INFO - Copied results to C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p04.hdf
2025-12-29 06:36:13 - ras_commander.remote.Execution - INFO - Plan 04 completed successfully (880.5s)
2025-12-29 06:36:13 - ras_commander.remote.Execution - INFO - Distributed execution complete: 3 succeeded, 0 failed
Execution complete in 880.6 seconds (14.7 minutes)
# Display results summary from results_df
desired_cols = ['plan_number', 'plan_title', 'completed', 'has_errors', 'has_warnings', 'runtime_complete_process_hours']
available_cols = [c for c in desired_cols if c in ras.results_df.columns]
ras.results_df[available_cols]
# Display remote execution results
if remote_results:
print("REMOTE Execution Results:")
print("="*70)
for plan_num, result in remote_results.items():
if result.success:
print(f" Plan {plan_num}: SUCCESS ({result.execution_time:.1f}s)")
print(f" HDF Path: {result.hdf_path}")
else:
print(f" Plan {plan_num}: FAILED - {result.error_message}")
success_count = sum(1 for r in remote_results.values() if r.success)
print(f"\nSummary: {success_count}/{len(remote_results)} plans succeeded")
else:
print("No remote results - run the remote execution cell above first.")
REMOTE Execution Results:
======================================================================
Plan 03: SUCCESS (740.1s)
HDF Path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p03.hdf
Plan 06: SUCCESS (847.6s)
HDF Path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p06.hdf
Plan 04: SUCCESS (880.5s)
HDF Path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p04.hdf
Summary: 3/3 plans succeeded
Verification and Validation¶
What to Verify After Remote Execution¶
1. Remote Connection Success - ✓ Worker connected successfully (check session ID in logs) - ✓ Project files deployed to remote share - ✓ HEC-RAS process started on remote machine
2. Execution Status - ✓ Return code = 0 (success) - ✓ HDF file created on remote machine - ✓ Compute messages indicate "Run completed successfully" - ✓ No errors in execution log
3. File Transfer Validation - ✓ HDF results copied back to local machine - ✓ File size matches expected (not truncated) - ✓ HDF file is readable and contains results
4. Result Quality - ✓ Check compute messages for warnings - ✓ Verify WSE/depth values are reasonable - ✓ No NaN values in critical areas - ✓ Hydraulic stability (no excessive oscillations)
Audit Trail¶
Save these artifacts for professional review:
- Execution logs: logs/remote_execution_{timestamp}.log
- Compute messages: Extract from HDF and save as text
- Return codes: Document success/failure for each worker
- Network transfer logs: Verify data integrity
LLM Forward Principle¶
Remote execution creates multiple review pathways: 1. Traditional Engineering Review: Open HDF in HEC-RAS GUI 2. Visual Inspection: Plot results (WSE, velocity, etc.) 3. Code Audit Trail: Review execution logs and parameters
Part 5: Verify Results¶
Check that HDF files were created and contain valid results.
# Verify HDF results
from ras_commander import HdfResultsPlan
print("Result Verification:")
print("="*70)
# Check plans that were executed (either local or remote)
plans_to_check = LOCAL_PLANS if local_results else (REMOTE_PLANS if remote_results else [])
for plan_num in plans_to_check:
hdf_path = project_path / f"{ras.project_name}.p{plan_num}.hdf"
if hdf_path.exists():
size_mb = hdf_path.stat().st_size / (1024 * 1024)
print(f"\nPlan {plan_num}:")
print(f" HDF Size: {size_mb:.2f} MB")
# Get compute messages
msgs = HdfResultsPlan.get_compute_messages(hdf_path)
if "completed successfully" in msgs.lower() or "complete process" in msgs.lower():
print(f" Status: SUCCESS")
else:
print(f" Status: Check messages")
# Get volume accounting
vol = HdfResultsPlan.get_volume_accounting(hdf_path)
if vol is not None and len(vol) > 0:
error_pct = vol['Error Percent'].iloc[0]
print(f" Volume Error: {error_pct:.4f}%")
else:
print(f"\nPlan {plan_num}: HDF not found")
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Using existing Path object HDF file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p03.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Final validated file path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p03.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Reading computation messages from HDF: BaldEagleDamBrk.p03.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Successfully extracted 2013 characters from HDF
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Using existing Path object HDF file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p03.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Final validated file path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p03.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Using existing Path object HDF file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p04.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Final validated file path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p04.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Reading computation messages from HDF: BaldEagleDamBrk.p04.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Successfully extracted 1667 characters from HDF
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Using existing Path object HDF file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p04.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Final validated file path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p04.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Using existing Path object HDF file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p06.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Final validated file path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p06.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Reading computation messages from HDF: BaldEagleDamBrk.p06.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Successfully extracted 1694 characters from HDF
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Using existing Path object HDF file: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p06.hdf
2025-12-29 06:36:13 - ras_commander.hdf.HdfResultsPlan - INFO - Final validated file path: C:\Users\billk_clb\anaconda3\envs\rascmdr_piptest\Lib\site-packages\examples\example_projects\BaldEagleCrkMulti2D_500\BaldEagleDamBrk.p06.hdf
Result Verification:
======================================================================
Plan 03:
HDF Size: 59.07 MB
Status: SUCCESS
Volume Error: 0.0187%
Plan 04:
HDF Size: 81.73 MB
Status: SUCCESS
Volume Error: 0.0007%
Plan 06:
HDF Size: 577.57 MB
Status: SUCCESS
Volume Error: 0.0003%
Part 6: Manual Worker Configuration (Optional)¶
You can also create workers programmatically without a JSON file.
# Example: Create a PsExec worker manually
# Uncomment and modify with your settings to test
# manual_worker = init_ras_worker(
# "psexec",
# hostname="192.168.1.100",
# share_path=r"\\192.168.1.100\RasRemote",
# worker_folder=r"C:\RasRemote",
# credentials={
# "username": "your_username",
# "password": "your_password"
# },
# session_id=2,
# cores_total=8,
# cores_per_plan=2
# )
#
# print(f"Manual worker created: {manual_worker.worker_id}")
# print(f" Parallel Capacity: {manual_worker.max_parallel_plans} plans")
print("Uncomment the code above to create a manual worker.")
Uncomment the code above to create a manual worker.
Part 7: Cleanup (Optional)¶
Clean up temporary worker folders on remote shares.
# Cleanup function for remote shares
def cleanup_remote_shares(workers, dry_run=True):
"""Clean up worker folders from remote shares."""
import shutil
seen_shares = set()
for w in workers:
if not hasattr(w, 'share_path') or not w.share_path:
continue
share_path = Path(w.share_path)
if str(share_path) in seen_shares:
continue
seen_shares.add(str(share_path))
# Check if share exists before accessing
if not share_path.exists():
continue
try:
folders = [f for f in share_path.iterdir() if f.is_dir()]
print(f"Share: {share_path}")
print(f" Folders: {len(folders)}")
for folder in folders:
folder_size = sum(f.stat().st_size for f in folder.rglob('*') if f.is_file())
folder_size_mb = folder_size / (1024 * 1024)
if dry_run:
print(f" [WOULD DELETE] {folder.name} ({folder_size_mb:.1f} MB)")
else:
print(f" [DELETING] {folder.name}")
shutil.rmtree(folder, ignore_errors=True)
except Exception as e:
print(f"Error accessing {share_path}: {e}")
# Preview cleanup (dry run)
if workers:
print("CLEANUP PREVIEW (dry_run=True):")
cleanup_remote_shares(workers, dry_run=True)
print("Set dry_run=False to actually delete folders.")
else:
print("No workers loaded - nothing to clean up.")
CLEANUP PREVIEW (dry_run=True):
Share: \\192.168.3.8\RasRemote\
Folders: 68
[WOULD DELETE] BaldEagleDamBrk_10_SW1_0d970906 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_10_SW1_f8ae583e (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_11_SW2_2cf5ce15 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_11_SW2_d5d823d6 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_12_SW3_d4137c14 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_14_SW4_3996e252 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_16_SW1_9b4d5e9a (338.8 MB)
[WOULD DELETE] BaldEagleDamBrk_16_SW1_d575be09 (337.9 MB)
[WOULD DELETE] BaldEagleDamBrk_20_SW2_ab6c8c81 (337.9 MB)
[WOULD DELETE] BaldEagleDamBrk_20_SW2_ba9a2113 (338.8 MB)
[WOULD DELETE] BaldEagleDamBrk_21_SW3_21f0530e (338.8 MB)
[WOULD DELETE] BaldEagleDamBrk_21_SW3_add187ed (337.9 MB)
[WOULD DELETE] BaldEagleDamBrk_26_SW1_99b240c3 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_26_SW1_a7f83eac (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_27_SW2_026418cc (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_28_SW3_17e1732c (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_29_SW4_8403544b (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_30_SW1_29ffb670 (382.2 MB)
[WOULD DELETE] BaldEagleDamBrk_30_SW1_53c64908 (382.8 MB)
[WOULD DELETE] BaldEagleDamBrk_30_SW2_81a63748 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_31_SW2_394a1bf2 (404.4 MB)
[WOULD DELETE] BaldEagleDamBrk_31_SW2_b849d80f (404.7 MB)
[WOULD DELETE] BaldEagleDamBrk_31_SW3_e510864f (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_32_SW3_6c9eab59 (404.7 MB)
[WOULD DELETE] BaldEagleDamBrk_33_SW1_56d064a4 (999.5 MB)
[WOULD DELETE] BaldEagleDamBrk_41_SW1_a030ff99 (470.5 MB)
[WOULD DELETE] BaldEagleDamBrk_41_SW2_d75d8ba5 (999.5 MB)
[WOULD DELETE] BaldEagleDamBrk_42_SW2_7c486261 (470.5 MB)
[WOULD DELETE] BaldEagleDamBrk_42_SW3_fdf7a788 (1021.4 MB)
[WOULD DELETE] BaldEagleDamBrk_43_SW1_effffbcb (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_43_SW3_cfcab381 (470.5 MB)
[WOULD DELETE] BaldEagleDamBrk_52_SW1_ab3d9dc3 (536.4 MB)
[WOULD DELETE] BaldEagleDamBrk_53_SW2_ada27d20 (536.4 MB)
[WOULD DELETE] BaldEagleDamBrk_54_SW3_6c1c609d (569.3 MB)
[WOULD DELETE] BaldEagleDamBrk_55_SW2_0c32ab97 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_63_SW1_a1e21c29 (624.3 MB)
[WOULD DELETE] BaldEagleDamBrk_64_SW2_b9e688d6 (624.3 MB)
[WOULD DELETE] BaldEagleDamBrk_65_SW1_3bc76323 (1076.5 MB)
[WOULD DELETE] BaldEagleDamBrk_65_SW3_cb298229 (635.3 MB)
[WOULD DELETE] BaldEagleDamBrk_66_SW2_1d4d8c15 (1098.4 MB)
[WOULD DELETE] BaldEagleDamBrk_66_SW3_61d29707 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_74_SW1_15b0bfe5 (712.6 MB)
[WOULD DELETE] BaldEagleDamBrk_74_SW3_f448b71b (1109.4 MB)
[WOULD DELETE] BaldEagleDamBrk_74_SW4_bebceae4 (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_75_SW1_8a2c5203 (1186.9 MB)
[WOULD DELETE] BaldEagleDamBrk_75_SW2_56a85889 (712.6 MB)
[WOULD DELETE] BaldEagleDamBrk_76_SW3_f10c8ea4 (712.6 MB)
[WOULD DELETE] BaldEagleDamBrk_85_SW1_2a5c8640 (811.9 MB)
[WOULD DELETE] BaldEagleDamBrk_86_SW1_e496bdaa (0.0 MB)
[WOULD DELETE] BaldEagleDamBrk_86_SW2_07f64699 (811.9 MB)
[WOULD DELETE] BaldEagleDamBrk_87_SW3_70d098a3 (811.9 MB)
[WOULD DELETE] BaldEagleDamBrk_96_SW1_883c66a2 (845.0 MB)
[WOULD DELETE] BaldEagleDamBrk_97_SW1_239e5970 (1175.9 MB)
[WOULD DELETE] BaldEagleDamBrk_97_SW2_aa5d6216 (1186.9 MB)
[WOULD DELETE] BaldEagleDamBrk_97_SW2_c2165a4a (867.1 MB)
[WOULD DELETE] BaldEagleDamBrk_98_SW2_cb8d96b7 (1175.9 MB)
[WOULD DELETE] BaldEagleDamBrk_98_SW3_013d7b6b (1186.9 MB)
[WOULD DELETE] BaldEagleDamBrk_98_SW3_194ec703 (878.2 MB)
[WOULD DELETE] BaldEagleDamBrk_99_SW3_4568cd3b (1175.9 MB)
[WOULD DELETE] Scott_County_New_07_SW1_3e06a454 (762.3 MB)
[WOULD DELETE] Scott_County_New_07_SW1_49e0cb37 (856.4 MB)
[WOULD DELETE] Scott_County_New_08_SW2_b3465c28 (762.3 MB)
[WOULD DELETE] Scott_County_New_08_SW2_c5b972ad (856.4 MB)
[WOULD DELETE] Scott_County_New_09_SW3_79cd56a2 (762.3 MB)
[WOULD DELETE] Scott_County_New_09_SW3_ec684b0b (856.4 MB)
[WOULD DELETE] Scott_County_New_10_SW4_d00e1ba4 (762.3 MB)
[WOULD DELETE] Scott_County_New_10_SW4_f124653c (856.2 MB)
[WOULD DELETE] Scott_County_New_12_SW2_de2827f0 (762.3 MB)
Set dry_run=False to actually delete folders.
Summary: Local vs Remote Execution¶
| Feature | Local (compute_parallel) |
Remote (compute_parallel_remote) |
|---|---|---|
| Setup | None | Configure RemoteWorkers.json |
| Execution | Local machine only | Remote machines via PsExec/Docker |
| File Transfer | Direct | Via network shares |
| Scaling | Limited by local cores | Unlimited remote machines |
| Best For | Small jobs, testing | Large batches, distributed work |
Quick Reference¶
Local Parallel:
results = RasCmdr.compute_parallel(
plan_number=["01", "02", "03"],
max_workers=3,
num_cores=2,
ras_object=ras
)
Remote Parallel:
workers = load_workers_from_json("RemoteWorkers.json")
results = compute_parallel_remote(
plan_numbers=["01", "02", "03"],
workers=workers,
num_cores=4
)
For complete setup instructions, see:
- feature_dev_notes/RasRemote/REMOTE_WORKER_SETUP_GUIDE.md