构建可扩展多维数组框架的关键是依托成熟生态增强而非重写numpy,以mars为底座实现分布式能力,分层设计用户层、表达层、执行层,支持动态维度、稀疏结构与轻量接入现有工具链。

构建可扩展的多维数组框架,关键不在“从零造轮子”,而在于选对底层支撑、设计好分层接口、预留分布式能力。真正实用的方案,是站在成熟生态上做增强,不是重写NumPy。
以Mars为底座,天然支持横向扩展
Mars是阿里云开源的张量计算框架,它不是替代NumPy,而是让NumPy代码自动获得分布式能力。你写的是np.array风格的代码,背后可调度到千核集群。
- Tensor模块完全兼容NumPy API:用
mt.random.uniform代替np.random.uniform,shape支持亿级维度,无需改逻辑 - DataFrame模块对标Pandas:读取10亿行CSV、执行
groupby().sum(),自动切分任务、聚合结果 - Learn模块封装scikit-learn接口:调用
PCA(n_components=2)即可在TB级特征矩阵上降维,不需手动分片或采样
明确分层:用户层 → 表达层 → 执行层
避免把计算逻辑和调度逻辑混在一起。一个健壮的框架必须清晰分离关注点:
-
用户层:暴露类NumPy/类Pandas接口,开发者只关心“我要做什么”,比如
df['x'].clip(0, 100) -
表达层:将操作转为延迟执行的DAG(有向无环图),记录依赖关系但不立刻算,例如
a + b * c生成计算图节点 - 执行层:根据资源情况决定是单机多线程执行,还是拆分到Worker节点;支持按chunk粒度调度,适应内存受限场景
支持动态维度与稀疏结构
真实业务中,数组常随数据流入增长(如日志流)、或存在大量空值(如用户行为矩阵)。硬编码shape会卡死扩展性。
- 用
mt.tensor.from_dataframe()接入实时数据流,自动追加chunk,保持逻辑不变 - 对高维稀疏场景,结合
mt.sparse模块(Mars已内置支持),存储仅存非零值+坐标,内存占用可降90%+ - 允许运行时调整chunk size:小chunk利于并行,大chunk减少调度开销,可通过
tensor.rechunk((10000, -1))重划分
轻量接入已有工具链
不强行替换整个技术栈,而是作为“增强插件”嵌入现有流程:
- 与Dask兼容:Mars可导出DAG供Dask调度器执行,已有Dask集群可复用
- 输出无缝对接PyArrow/Parquet:
tensor.to_arrow_table()直接生成列式结构,供下游BI或Spark消费 - 支持Jupyter交互式调试:
.visualize()方法一键渲染计算图,看清哪一步成了瓶颈











