bulk-operations
Bulk data processing and operations
Source facts
- Repository
- ffsshhttiikk/opencode-agents-skills
- Last source activity
- February 28, 2026 at 22:46
- Detected SKILL.md language
- English
- Stars
- 3
- Forks
- 2
Install options
The review-first prompt is selected by default. You can switch to a direct command or download a local copy.
Review the source files
Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.
Showing SKILL.md
SKILL.md
Source instructions · Read-only preview- name
- bulk-operations
- description
- Bulk data processing and operations
- license
- MIT
- compatibility
- opencode
- metadata
- {"audience":"developers","category":"utilities"}
## What I do
- Implement bulk database operations
- Process large datasets efficiently
- Handle batch processing
- Implement progress tracking
- Handle errors in bulk operations
- Optimize bulk imports/exports
- Manage memory for large files
- Implement parallel processing
## When to use me
When implementing bulk data operations or processing large datasets.
## Bulk Database Operations
```python
from typing import List, Dict, Any, Callable
from dataclasses import dataclass
from contextlib import contextmanager
import itertools
@dataclass
class BulkOperationResult:
"""Result of bulk operation."""
total: int
successful: int
failed: int
errors: List[Dict[str, Any]]
duration_seconds: float
class BulkDatabaseOperations:
"""Bulk database operations manager."""
def __init__(self, db_session):
self.session = db_session
@contextmanager
def bulk_insert(
self,
batch_size: int = 1000
):
"""Context manager for bulk inserts."""
objects = []
try:
yield objects
finally:
if objects:
self._flush_insert(objects)
objects.clear()
def _flush_insert(self, objects: List[Any]) -> int:
"""Flush pending inserts to database."""
self.session.add_all(objects)
self.session.commit()
return len(objects)
def bulk_insert_records(
self,
model_class,
records: List[Dict[str, Any]]
) -> BulkOperationResult:
"""Bulk insert records efficiently."""
start_time = datetime.utcnow()
successful = 0
failed = 0
errors = []
# Process in batches
batch_size = 1000
for i in range(0, len(records), batch_size):
batch = records[i:i + batch_size]
try:
self.session.bulk_insert_mappings(
model_class,
batch
)
self.session.commit()
successful += len(batch)
except Exception as e:
# Rollback and retry individually
self.session.rollback()
for record in batch:
try:
obj = model_class(**record)
self.session.add(obj)
self.session.commit()
successful += 1
except Exception as record_error:
failed += 1
errors.append({
"record": record,
"error": str(record_error)
})
return BulkOperationResult(
total=len(records),
successful=successful,
failed=failed,
errors=errors,
duration_seconds=(datetime.utcnow() - start_time).total_seconds()
)
def bulk_update(
self,
model_class,
updates: List[Dict[str, Any]],
match_field: str = "id"
) -> BulkOperationResult:
"""Bulk update records efficiently."""
start_time = datetime.utcnow()
successful = 0
failed = 0
errors = []
for update in updates:
try:
match_value = update.pop(match_field)
self.session.query(model_class).filter(
getattr(model_class, match_field) == match_value
).update(update, synchronize_session=False)
successful += 1
except Exception as e:
failed += 1
errors.append({
"update": update,
"error": str(e)
})
self.session.commit()
return BulkOperationResult(
total=len(updates),
successful=successful,
failed=failed,
errors=errors,
duration_seconds=(datetime.utcnow() - start_time).total_seconds()
)
def bulk_upsert(
self,
model_class,
records: List[Dict[str, Any]],
unique_fields: List[str]
) -> BulkOperationResult:
"""Bulk upsert (insert or update) records."""
start_time = datetime.utcnow()
successful = 0
failed = 0
errors = []
for record in records:
try:
# Build lookup query
filters = {
field: record.get(field)
for field in unique_fields
}
existing = self.session.query(model_class).filter_by(**filters).first()
if existing:
# Update
for key, value in record.items():
setattr(existing, key, value)
else:
# Insert
obj = model_class(**record)
self.session.add(obj)
successful += 1
except Exception as e:
failed += 1
errors.append({
"record": record,
"error": str(e)
})
self.session.commit()
return BulkOperationResult(
total=len(records),
successful=successful,
failed=failed,
errors=errors,
duration_seconds=(datetime.utcnow() - start_time).total_seconds()
)
```
## Chunked Processing
```python
from typing import Iterator, Callable, List
from dataclasses import dataclass
import asyncio
@dataclass
class ProcessingProgress:
"""Progress of chunked processing."""
total_items: int
processed_items: int
failed_items: int
current_chunk: int
total_chunks: int
percent_complete: float
elapsed_seconds: float
estimated_remaining_seconds: float
def to_dict(self) -> dict:
return {
"total": self.total_items,
"processed": self.processed_items,
"failed": self.failed_items,
"percent": self.percent_complete,
"elapsed": f"{self.elapsed_seconds:.2f}s",
"remaining": f"{self.estimated_remaining_seconds:.2f}s",
}
class ChunkedProcessor:
"""Process data in chunks with progress tracking."""
def __init__(
self,
chunk_size: int = 1000,
progress_callback: Callable[[ProcessingProgress], None] = None
):
self.chunk_size = chunk_size
self.progress_callback = progress_callback
self.start_time = None
def process_in_chunks(
self,
items: List[Any],
process_func: Callable[[List[Any]], List[Any]],
max_chunks: int = None
) -> tuple[List[Any], ProcessingProgress]:
"""Process items in chunks."""
self.start_time = datetime.utcnow()
total_items = len(items)
total_chunks = (total_items + self.chunk_size - 1) // self.chunk_size
if max_chunks:
total_chunks = min(total_chunks, max_chunks)
processed_items = 0
failed_items = 0
all_results = []
for chunk_idx in range(total_chunks):
start_idx = chunk_idx * self.chunk_size
end_idx = min(start_idx + self.chunk_size, total_items)
chunk = items[start_idx:end_idx]
try:
results = process_func(chunk)
all_results.extend(results)
processed_items += len(results)
except Exception as e:
failed_items += len(chunk)
# Log error but continue
print(f"Error processing chunk {chunk_idx}: {e}")
# Report progress
progress = self._calculate_progress(
total_items,
processed_items,
failed_items,
chunk_idx + 1,
total_chunks
)
if self.progress_callback:
self.progress_callback(progress)
return all_results, progress
def _calculate_progress(
self,
total_items: int,
processed_items: int,
failed_items: int,
current_chunk: int,
total_chunks: int
) -> ProcessingProgress:
"""Calculate current progress."""
elapsed = (datetime.utcnow() - self.start_time).total_seconds()
items_processed = processed_items + failed_items
percent_complete = (items_processed / total_items * 100) if total_items else 0
if elapsed > 0 and processed_items > 0:
items_per_second = processed_items / elapsed
remaining_items = total_items - items_processed
estimated_remaining = remaining_items / items_per_second
else:
estimated_remaining = 0
return ProcessingProgress(
total_items=total_items,
processed_items=processed_items,
failed_items=failed_items,
current_chunk=current_chunk,
total_chunks=total_chunks,
percent_complete=percent_complete,
elapsed_seconds=elapsed,
estimated_remaining_seconds=estimated_remaining
)
# Streaming iterator for large files
def stream_large_file(
file_path: str,
chunk_size: int = 10000,
parse_func: Callable[[str], Dict] = None
) -> Iterator[List[Dict]]:
"""Stream large file in chunks."""
parse_func = parse_func or json.loads
with open(file_path, 'r', encoding='utf-8') as f:
chunk = []
for line in f:
parsed = parse_func(line.strip())
chunk.append(parsed)
if len(chunk) >= chunk_size:
yield chunk
chunk = []
# Yield remaining items
if chunk:
yield chunk
```
## Parallel Processing
```python
import multiprocessing
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
from typing import List, Callable
class ParallelProcessor:
"""Parallel processing with configurable workers."""
def __init__(
self,
max_workers: int = None,
use_processes: bool = False
):
self.max_workers = max_workers or multiprocessing.cpu_count()
self.use_processes = use_processes
def execute(
self,
func: Callable,
items: List[Any],
progress_callback: Callable[[int, int], None] = None
) -> List[Any]:
"""Execute function on items in parallel."""
ExecutorClass = (
ProcessPoolExecutor
if self.use_processes
else ThreadPoolExecutor
)
with ExecutorClass(max_workers=self.max_workers) as executor:
futures = {
executor.submit(func, item): item
for item in items
}
results = []
for i, future in enumerate(
as_completed(futures.keys()),
1
):
try:
result = future.result()
results.append(result)
except Exception as e:
item = futures[future]
print(f"Error processing {item}: {e}")
if progress_callback:
progress_callback(i, len(items))
return results
def map_chunks(
self,
func: Callable,
chunks: List[List[Any]],
progress_callback: Callable[[int, int], None] = None
) -> List[Any]:
"""Process chunks in parallel."""
with ThreadPoolExecutor(max_workers=self.max_workers) as executor:
futures = {
executor.submit(func, chunk): idx
for idx, chunk in enumerate(chunks)
}
results = [None] * len(chunks)
for future in as_completed(futures.keys()):
idx = futures[future]
try:
results[idx] = future.result()
except Exception as e:
print(f"Error processing chunk {idx}: {e}")
results[idx] = None
if progress_callback:
progress_callback(idx + 1, len(chunks))
return results
```
## Batch Processing Queue
```python
from dataclasses import dataclass
from typing import Callable, Any
from datetime import datetime
import json
@dataclass
class BatchJob:
"""Batch job configuration."""
job_id: str
job_type: str
payload: dict
status: str = "pending"
created_at: datetime = None
started_at: datetime = None
completed_at: datetime = None
result: Any = None
error: str = None
retry_count: int = 0
max_retries: int = 3
class BatchJobProcessor:
"""Process batch jobs from queue."""
def __init__(self, queue, storage, max_concurrent: int = 5):
self.queue = queue
self.storage = storage
self.max_concurrent = max_concurrent
self.active_jobs = set()
async def process_queue(self) -> None:
"""Process jobs from queue."""
while True:
# Get next job
job_data = await self.queue.get()
if job_data is None:
break
job = BatchJob(**job_data)
# Check concurrent limit
while len(self.active_jobs) >= self.max_concurrent:
await asyncio.sleep(1)
# Process job
self.active_jobs.add(job.job_id)
try:
result = await self._execute_job(job)
job.status = "completed"
job.result = result
job.completed_at = datetime.utcnow()
await self.storage.save_job(job)
except Exception as e:
job.retry_count += 1
if job.retry_count >= job.max_retries:
job.status = "failed"
job.error = str(e)
job.completed_at = datetime.utcnow()
else:
# Requeue with backoff
job.status = "pending"
await self.queue.put(job.to_dict())
await self.storage.save_job(job)
finally:
self.active_jobs.discard(job.job_id)
async def _execute_job(self, job: BatchJob) -> Any:
"""Execute a single job."""
job_handlers = {
"import": self._handle_import,
"export": self._handle_export,
"process": self._handle_process,
}
handler = job_handlers.get(job.job_type)
if not handler:
View on GitHubThis SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub