在使用 2核2G 内存的服务器运行 Python 数据处理脚本时,资源非常有限。为了确保脚本稳定、高效运行,避免内存溢出(OOM)或 CPU 过载,需要从多个方面进行优化。以下是关键的优化建议和参数调整方向:
一、Python 脚本层面的优化
1. 减少内存占用
-
使用生成器(Generator)代替列表:
# ❌ 避免一次性加载大量数据到内存 data = [process(x) for x in large_dataset] # ✅ 使用生成器逐个处理 def process_data(data): for x in data: yield process(x) -
分块处理大文件(如 CSV、JSON):
import pandas as pd chunk_size = 1000 # 根据内存调整 for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size): process(chunk) -
及时释放变量:
del large_variable import gc gc.collect() # 手动触发垃圾回收
2. 选择轻量级库
- 优先使用
pandas+numpy,但注意其内存消耗。 - 对于超大数据,考虑使用
polars(更省内存和更快)、vaex或dask(延迟计算、分块处理)。
3. 避免复制数据
- 使用
inplace=True修改 DataFrame:df.dropna(inplace=True) - 使用
.copy()时要谨慎。
二、系统与运行环境优化
1. 限制并发线程数
- 2核 CPU 建议最多使用 2 个并行进程/线程。
- 避免使用过多
multiprocessing进程(每个进程至少几百 MB 内存开销)。 -
推荐使用
concurrent.futures.ThreadPoolExecutor处理 I/O 密集型任务,而非 CPU 密集型。from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=2) as executor: executor.map(process_func, data)
2. 设置内存监控与保护
-
在脚本中加入内存监控:
import psutil import os def get_memory_usage(): process = psutil.Process(os.getpid()) return process.memory_info().rss / 1024 / 1024 # MB -
当内存接近 1.5GB 时主动报错或暂停。
3. 关闭不必要的后台服务
- 确保服务器上没有运行 Nginx、MySQL、Docker 等占用资源的服务(除非必要)。
- 使用
htop或top查看资源占用。
三、Pandas 特定优化参数
# 读取 CSV 时优化
df = pd.read_csv(
'data.csv',
dtype={'col1': 'int32', 'col2': 'category'}, # 显式指定低内存类型
parse_dates=['date_col'], # 避免后续转换
usecols=['col1', 'col2', 'col3'], # 只读需要的列
chunksize=1000 # 分块读取
)
- 使用
category类型替代字符串(节省内存)。 - 数值类型尽量用
int8,int16,float32而非默认int64,float64。
四、虚拟内存(Swap)配置
2G 内存容易不足,建议增加 Swap 空间防止 OOM:
# 创建 2GB Swap 文件
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
注意:Swap 会降低性能,但能防止程序崩溃。
五、其他建议
| 优化项 | 建议 |
|---|---|
| 数据存储格式 | 使用 parquet 或 feather 替代 CSV(更快、更省空间) |
| 日志输出 | 减少 print 输出频率,避免频繁 I/O |
| 异常处理 | 加入 try-except 防止中断 |
| 脚本调度 | 使用 cron 或 airflow 控制运行时间,避免重叠执行 |
六、推荐工具链组合(适合 2核2G)
- 数据处理:
pandas+polars(小数据用 pandas,大数据用 polars) - 并行处理:
concurrent.futures(线程池) - 内存管理:手动
del+gc.collect() - 文件格式:
parquet>csv - 监控:
psutil实时查看内存/CPU
总结:关键优化点
✅ 分块处理数据
✅ 使用低内存数据类型
✅ 避免全量加载大文件
✅ 控制并发数(≤2)
✅ 合理使用 Swap
✅ 及时释放内存
通过以上优化,即使在 2核2G 的服务器上,也能稳定运行大多数中小型 Python 数据处理任务。
如果你提供具体脚本或数据规模(如:处理 100MB CSV / 每天 10 万行),我可以给出更针对性的建议。
轻量云Cloud