cPanel终端读取Parquet文件触发ArrowMemoryError问题求助
解决cPanel环境下读取Parquet文件的ArrowMemoryError问题
问题概述
在cPanel终端运行Python脚本读取46.65MB的CA_s.parquet文件时触发pyarrow.lib.ArrowMemoryError: malloc of size 106255424 failed错误,本地电脑可正常执行。核心执行代码:
df = pd.read_parquet(file_path + 'CA_s.parquet')
当前服务器内存状态(free -m输出):
| total | used | free | shared | buff/cache | available | |
|---|---|---|---|---|---|---|
| Mem: | 15507 | 5497 | 2561 | 1209 | 7447 | 7588 |
| Swap: | 1023 | 811 | 212 |
解决思路与方案
1. 分块读取Parquet文件
避免一次性加载整文件到内存,利用Parquet的分块特性分批读取处理:
import pyarrow.parquet as pq # 按固定行数分批读取 pq_file = pq.ParquetFile(file_path + 'CA_s.parquet') for batch in pq_file.iter_batches(batch_size=10000): df_chunk = batch.to_pandas() # 在此处理当前分块数据 # 或通过数据集接口批量读取 dataset = pq.ParquetDataset(file_path + 'CA_s.parquet') for table_chunk in dataset.to_batches(): df_chunk = table_chunk.to_pandas() # 在此处理当前分块数据
2. 调整PyArrow内存配置
限制PyArrow的内存使用上限,或禁用线程减少内存开销:
import pyarrow as pa # 设置内存池上限为1GB pa.set_memory_pool(pa.MemoryPool().set_limit(1024 * 1024 * 1024)) # 读取时禁用多线程,减少内存占用 df = pd.read_parquet( file_path + 'CA_s.parquet', pyarrow_options={"use_threads": False} )
3. 优化数据类型压缩内存
读取时指定更紧凑的数据类型,或读取后优化列类型:
# 读取阶段指定类型(示例:将重复值多的字符串列设为category) df = pd.read_parquet( file_path + 'CA_s.parquet', dtype={ "target_string_col": "category", "large_int_col": "int32" } ) # 读取后自动优化数据类型 df = df.convert_dtypes() # 手动压缩数值列 for col in df.select_dtypes(include=['int64', 'float64']).columns: df[col] = pd.to_numeric(df[col], downcast='integer' if df[col].dtype == 'int64' else 'float')
4. 清理服务器缓存释放内存
执行命令清理系统缓存,释放可用内存(需root权限,无权限可联系主机商):
sync && echo 3 > /proc/sys/vm/drop_caches
5. 扩展Swap空间
当前Swap剩余仅212MB,可临时创建Swap文件缓解内存压力:
# 创建1GB Swap文件 sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
若需永久生效,将/swapfile none swap sw 0 0添加到/etc/fstab文件。
6. 检查cPanel用户内存配额
cPanel可能对单个用户进程有内存限制,查看当前配额:
ulimit -v
若配额低于需求,联系主机商调整用户内存限制。
内容的提问来源于stack exchange,提问作者Shane S
相关产品推荐
相关产品推荐

