Version: 1.0.0
Updated: 2024-01-20
Target Audience: Power Users, System Administrators
Metric | Default | Optimized | Enterprise |
---|---|---|---|
Concurrent Downloads | 3 | 8 | 16 |
Rate Limit (calls/sec) | 1.0 | 2.0 | 5.0 |
Memory Usage (MB) | 150 | 300 | 1000 |
Download Speed (MB/s) | 2-5 | 10-20 | 50+ |
Success Rate | 95% | 98% | 99.5% |
Hardware:
CPU: 4+ cores, 3.0+ GHz
RAM: 8+ GB
Storage: 100+ GB SSD
Network: 100+ Mbps fiber
Software:
OS: Linux (Ubuntu 20.04+)
Python: 3.11+
SSD storage for downloads
Hardware:
CPU: 8+ cores, 3.5+ GHz
RAM: 16+ GB DDR4
Storage: 1+ TB NVMe SSD
Network: 1+ Gbps dedicated
Software:
OS: Linux with performance kernel
Python: 3.12 with optimizations
RAID 0 for download storage
Create performance_config.ini
:
[downloader]
max_concurrent_downloads = 8
rate_limit_delay = 0.5
connection_timeout = 60
retry_attempts = 5
[storage]
download_dir = /mnt/fast_ssd/downloads
use_memory_cache = true
cache_size_mb = 512
[network]
chunk_size = 1048576 # 1MB chunks
max_connections = 10
keepalive = true
[performance]
verify_downloads = false
extract_metadata = false
log_level = WARNING
[memory]
max_memory_mb = 1024
cleanup_frequency = 50
garbage_collect_frequency = 100
[downloader]
max_concurrent_downloads = 4
buffer_size = 65536 # 64KB
stream_downloads = true
# Optimize TCP settings for high throughput
echo 'net.core.rmem_max = 67108864' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 67108864' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control = bbr' >> /etc/sysctl.conf
# Apply settings
sysctl -p
#!/usr/bin/env python3
"""
High-performance downloader with optimizations.
"""
import asyncio
from telegram_audio_downloader.downloader import AudioDownloader
class HighPerformanceDownloader(AudioDownloader):
def __init__(self, **kwargs):
super().__init__(
max_concurrent_downloads=16,
rate_limit_delay=0.3,
**kwargs
)
async def optimized_download(self, group, **kwargs):
"""Optimized download with connection pooling."""
await self.initialize_client()
try:
result = await self.download_audio_files(
group_identifier=group,
**kwargs
)
return result
finally:
pass # Keep connections warm
async def main():
downloader = HighPerformanceDownloader()
result = await downloader.optimized_download("@music_group", limit=100)
print(f"Downloaded {result['completed']} files")
if __name__ == "__main__":
asyncio.run(main())
# Command-line optimization
telegram-audio-downloader download @group \
--max-concurrent 8 \
--rate-limit 0.5 \
--skip-existing \
--no-verify \
--chunk-size 1MB
# Format for optimal performance
mkfs.ext4 -O ^has_journal /dev/nvme0n1p1
# Mount with performance options
mount -o noatime,nodiratime,nobarrier /dev/nvme0n1p1 /mnt/downloads
# optimal_storage.py
from pathlib import Path
class StorageManager:
def __init__(self, base_path="/mnt/downloads"):
self.base_path = Path(base_path)
self.setup_directories()
def setup_directories(self):
"""Create optimal directory structure."""
directories = [
"incoming", # New downloads
"completed", # Finished downloads
"cache", # Temporary files
]
for directory in directories:
(self.base_path / directory).mkdir(parents=True, exist_ok=True)
def get_optimal_path(self, file_info):
"""Get optimal path based on file characteristics."""
if file_info.get('size', 0) > 50 * 1024 * 1024: # 50MB
return self.base_path / "completed" / "large"
date_dir = file_info.get('date', '').split('T')[0]
return self.base_path / "completed" / date_dir
# memory_manager.py
import gc
import psutil
class MemoryManager:
def __init__(self, max_memory_mb=1024):
self.max_memory_bytes = max_memory_mb * 1024 * 1024
def get_memory_usage(self):
"""Get current memory usage."""
process = psutil.Process()
return {
'rss_mb': process.memory_info().rss / 1024 / 1024,
'percent': process.memory_percent()
}
def is_memory_limit_exceeded(self):
"""Check if memory limit is exceeded."""
usage = self.get_memory_usage()
return usage['rss_mb'] > self.max_memory_bytes / 1024 / 1024 * 0.8
def emergency_cleanup(self):
"""Perform emergency memory cleanup."""
return gc.collect()
# Usage in downloads
memory_manager = MemoryManager()
if memory_manager.is_memory_limit_exceeded():
memory_manager.emergency_cleanup()
# monitor.py
import time
import psutil
from dataclasses import dataclass
@dataclass
class PerformanceMetrics:
downloads_completed: int = 0
downloads_failed: int = 0
average_speed_mbps: float = 0.0
cpu_usage: float = 0.0
memory_usage_mb: float = 0.0
success_rate: float = 0.0
class PerformanceMonitor:
def __init__(self):
self.start_time = time.time()
self.downloads_completed = 0
self.downloads_failed = 0
self.total_bytes = 0
def get_current_metrics(self):
"""Get current performance metrics."""
cpu_percent = psutil.cpu_percent()
memory = psutil.virtual_memory()
return PerformanceMetrics(
downloads_completed=self.downloads_completed,
downloads_failed=self.downloads_failed,
average_speed_mbps=self._calculate_speed(),
cpu_usage=cpu_percent,
memory_usage_mb=memory.used / (1024 * 1024),
success_rate=self._calculate_success_rate()
)
def _calculate_speed(self):
"""Calculate average download speed."""
duration = time.time() - self.start_time
if duration > 0:
return (self.total_bytes / duration) / (1024 * 1024)
return 0.0
def _calculate_success_rate(self):
"""Calculate download success rate."""
total = self.downloads_completed + self.downloads_failed
if total > 0:
return self.downloads_completed / total
return 0.0
def on_download_complete(self, file_size):
"""Record successful download."""
self.downloads_completed += 1
self.total_bytes += file_size
def on_download_failed(self):
"""Record failed download."""
self.downloads_failed += 1
# Global monitor instance
monitor = PerformanceMonitor()
# Monitor downloads in real-time
telegram-audio-downloader download @group --monitor --verbose
# Generate performance report
telegram-audio-downloader stats --performance --export-json
#!/usr/bin/env python3
"""
Benchmark script for performance testing.
"""
import asyncio
import time
from telegram_audio_downloader.downloader import AudioDownloader
async def benchmark_download_speeds():
"""Benchmark different configuration settings."""
configs = [
{"max_concurrent": 1, "rate_limit": 2.0}, # Conservative
{"max_concurrent": 4, "rate_limit": 1.0}, # Balanced
{"max_concurrent": 8, "rate_limit": 0.5}, # Aggressive
]
for config in configs:
print(f"Testing config: {config}")
downloader = AudioDownloader(**config)
await downloader.initialize_client()
start_time = time.time()
try:
result = await downloader.download_audio_files(
"@test_group",
limit=10
)
duration = time.time() - start_time
speed = result.get('total_size', 0) / duration / (1024 * 1024)
print(f" Duration: {duration:.1f}s")
print(f" Speed: {speed:.1f} MB/s")
print(f" Success: {result['completed']}/{result['completed'] + result['failed']}")
finally:
await downloader.close()
print()
if __name__ == "__main__":
asyncio.run(benchmark_download_speeds())
# Test current performance
telegram-audio-downloader download @test_group \
--limit 10 \
--benchmark \
--verbose
# Compare configurations
for concurrent in 1 4 8; do
echo "Testing $concurrent concurrent downloads"
time telegram-audio-downloader download @test_group \
--limit 20 \
--max-concurrent $concurrent \
--skip-existing
done
# High-speed download
telegram-audio-downloader download @group \
--max-concurrent 8 \
--rate-limit 0.5 \
--no-verify \
--skip-existing
# Memory-efficient download
telegram-audio-downloader download @group \
--max-concurrent 2 \
--memory-limit 512MB \
--cleanup-frequency 10
# Network-optimized download
telegram-audio-downloader download @group \
--chunk-size 2MB \
--timeout 60 \
--max-retries 5
# Monitor system resources during download
# Terminal 1: Start download
telegram-audio-downloader download @large_group --monitor
# Terminal 2: Monitor system
watch -n 1 'free -h && echo && df -h && echo && ps aux | grep telegram'
For additional optimization help, visit our GitHub repository or performance discussions.
Last updated: 2024-01-20
Version: 1.0.0