ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Apache Arrow MATLAB 接口(arrow.*)设计指南:内存交互、文件序列化与跨语言零拷贝共享

Apache Arrow MATLAB 接口(arrow.*)设计指南:内存交互、文件序列化与跨语言零拷贝共享 数据工程数据分析大数据【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址https://gitcode.com/gh_mirrors/arrow12/arrow点击查看免费下载Apache Arrow 是一个面向高性能列式数据分析的多语言工具箱。本文基于 matlab/doc/matlab_interface_for_apache_arrow_design.md 设计文档系统梳理 MATLAB 接口arrow.*类与函数的设计蓝图如何在 MATLAB 中创建、访问与释放 Arrow 内存如何与 Parquet、Feather、JSON、CSV 等文件格式互操作以及如何借助 C Data Interface 与 IPC 文件在 Python、R、Rust 等语言之间实现最小开销理想为零拷贝的数据共享。读完本文你将掌握 MATLAB 接口的完整 API 骨架、三个核心用例的端到端操作流程以及这些设计在当前仓库 matlab/ 目录中的实际落地方式。设计目标与使用场景设计文档将 MATLAB 接口定位为 Apache Arrow 生态的一部分通过一组打包好的arrow.*MATLAB 类与函数让用户直接与 Arrow C 库的关键功能交互而不是重新实现一套内存格式。文档为此定义了三个递进的使用场景UC1Arrow 内存交互使用 MATLAB 代码创建、访问和删除 Arrow 内存。UC2文件序列化使用 MATLAB 代码将 Arrow 内存序列化/反序列化到 Parquet、Feather、JSON、CSV 等文件格式。UC3跨语言数据迁移将内存中的表格数据以 MATLABtable表示以最小开销理想零拷贝迁移到 Python、R、Rust 等语言。UC1 为 UC2、UC3 奠定基础只有先能表达 Arrow 内存才能谈文件读写与跨语言共享。这一递进关系也直接反映在文档末尾的 Roadmap 时间表上。双层 API 设计MATLAB 层与 C 层设计文档规划了两层 API分别面向不同用户普通 MATLAB 用户使用 MATLAB API高级用户通过 MEX 函数调用 C API 进行扩展。MATLAB API面向普通用户规划暴露的核心 MATLAB 类与函数包括arrow.Bufferarrow.Arrayarrow.RecordBatcharrow.Tablearrow.Fieldarrow.Schemaarrow.type.DataType及其具体子类arrow.type.Float64、arrow.type.String、arrow.type.Date、arrow.type.Time等arrow.memory.getTotalBytesAllocated、arrow.memory.allocateBuffer等内存管理函数在 matlab/src/matlab/arrow/ 目录中可以看到这些设计的实际落地array.m、recordBatch.m、table.m、field.m、schema.m等工厂函数array/包下的具体数组类Float64Array.m、StringArray.m、TimestampArray.m等type/包下的类型体系Int8Type、TimestampType、TimeUnit枚举等以及buffer/Buffer.m等。C API面向高级用户为了与 Arrow C 库交互接口必须提供在 MATLABmxArray与对应 Arrow C 类型之间包装/解包的 C API。设计文档给出的示例与 Arrow 生态其余部分风格保持一致arrow::matlab::is_array、is_record_batch、is_tablearrow::matlab::unwrap_array/wrap_arrayarrow::matlab::unwrap_record_batch/wrap_record_batcharrow::matlab::unwrap_table/wrap_table从当前仓库源码看这一包装/解包思想通过proxy代理机制实现matlab/src/cpp/arrow/matlab/proxy/factory.cc 负责注册各类 proxy 对象matlab/src/cpp/arrow/matlab/mex/gateway.cc 中的MexFunction将 MATLAB 侧的调用转发到 C proxy。MATLAB 对象如arrow.array.Float64Array内部持有一个Proxy句柄通过它把构造、索引、类型查询等操作委托给 C 侧的 Arrow 对象从而实现 MATLAB 内存与 Arrow C 内存的桥接。UC1Arrow 内存交互这是最基础的用例。一个 MATLAB 开发者可以用arrow.array工厂函数从普通MATLAB 数组例如一个double类型的数值行向量创建arrow.Array随后对数组执行索引/切片、查询类型/类、从工作区清除等操作。关键设计点arrow.array工厂函数根据输入数组的 MATLAB 类型返回抽象类arrow.Array的类型特定具体子类。例如传入 double 数组返回arrow.Float64Array。设计文档还特别注明MATLAB 的missing值如NaN、NaT、undefined在构造arrow.Array子类实例时会被自动转换为 ArrowNULL值。设计文档给出的示例注意 MATLAB 中NaN被显示为NULL A randi(100, 1, 5) A 82 91 13 92 64 class(A) ans double A(4) NaN; % Set the fourth element to NaN. AA arrow.array(A); % Create an arrow.Array from A. class(AA) ans arrow.Float64Array AA(3:5) % Extract elements at indices 3 to 5 from AA. ans 13 NULL 64 clear AA; % Clear AA from workspace and release Arrow C memory.仓库中的类型映射与 NULL 处理matlab/README.md 给出了当前实现支持的 MATLAB 类型 → Arrow 数组类型映射表注意实际实现中这些数组类位于arrow.array包下如arrow.array.Float64Array与设计文档中的顶层arrow.Float64Array命名略有差异MATLAB 数组类型Arrow 数组类型uint8UInt8Arrayuint16UInt16Arrayuint32UInt32Arrayuint64UInt64Arrayint8Int8Arrayint16Int16Arrayint32Int32Arrayint64Int64ArraysingleFloat32ArraydoubleFloat64ArraylogicalBooleanArraystringStringArraydatetimeTimestampArraydurationTime32Array/Time64Array除missing值自动转NULL外实际实现还支持通过Valid参数显式指定合法性掩码validity mask。例如把 int8 数组中所有负数视为null matlabArray int8([122, -1, 456, -10, 789]) validElements matlabArray 0 arrowArray arrow.array(matlabArray, ValidvalidElements) arrowArray [ 122, null, 127, null, 127 ]UC2文件读写以 Feather 为例UC2 解决把 MATLAB 数据落到磁盘、再与其他进程交换的问题。设计文档以 Feather 文件为主线给出了从表构造到读写的完整开发者工作流。工作流一构造arrow.Table有两种途径。第一种是从一组arrow.Array对象逐列拼装每个数组对应表的一列 Var1 arrow.array([foo; bar; baz]); Var2 arrow.array([today; today 1; today 2]); Var3 arrow.array([10; 20; 30]); AT arrow.Table(Var1, Var2, Var3);第二种是从已有的 MATLABtable直接转换例如使用arrow.matlab2arrow函数 Weight [10; 24; 10; 12; 18]; Radius [80; 135; 65; 70; 150]; Density [10.2; 20.5; 11.2; 13.7; 17.8]; T table(Weight, Radius, Density); % Create a MATLAB table AT arrow.matlab2arrow(T); % Create an arrow.Table工作流二写入与读取 Feather 文件序列化arrow.Table时实例化一个arrow.FeatherTableWriter并调用其write方法 featherTableWriter arrow.FeatherTableWriter(); featherTableWriter.write(AT, data.feather);写入后的 Feather 文件可被外部进程如 Rust、Go读取和修改修改后再读回 MATLAB 时实例化arrow.FeatherTableReader featherTableReader arrow.FeatherTableReader(data.feather); AT featherTableReader.read();高级用户工作流实现自己的 Feather 写入支持设计文档明确描述了一条面向高级 MATLAB 用户的扩展路径也是理解整套架构的关键编写一个MEX 函数例如featherwriteMEX可被 MATLAB 代码直接调用在 MEX 函数内部使用arrow::matlab::unwrap_table把 MATLAB 侧的arrow.Table解包为 C 侧的arrow::Table将arrow::Table交给 Arrow C 库的arrow::ipc::feather::WriteTable写入 Feather 文件。读取方向arrow.FeatherTableReader遵循对称的工作流。这样高级用户基于底层构建块搭建对普通用户友好的高层接口——设计文档给出的典型例子就是featherwrite让写 Feather 文件变得极其简单。仓库中的落地证据matlab/src/cpp/arrow/matlab/io/feather/proxy/writer.cc 完整实现了这一设计Writer::write从 MATLAB 传入的参数中取出RecordBatchProxyID通过ProxyManager::getProxy获取 proxy 并调用unwrap()得到 CRecordBatch再用arrow::Table::FromRecordBatches组装成arrow::Table最后以arrow::ipc::feather::WriteProperties指定kFeatherV1Version并调用ipc::feather::WriteTable写出。而面向普通用户的featherwrite/featherread高层函数则位于 matlab/src/matlab/featherwrite.m 与 matlab/src/matlab/featherread.m与设计文档设想的高层接口完全对应。测试方面可参考 matlab/test/arrow/io/feather/tRoundTrip.m 的读写回环用例。UC3跨语言零拷贝内存共享Arrow 支持多种本地内存共享方式设计文档将其划分为两大类进程内共享In-Process Memory Sharing与进程外共享Out-of-Process Memory Sharing。进程内共享C Data InterfaceMATLAB 支持在 MATLAB 进程内运行 Python 代码。由于 MATLAB 与 Python 共享同一个虚拟地址空间理论上可以高效地在两者之间共享 Arrow 内存。Apache ArrowC Data Interface定义了一个轻量级 C API用于在同一虚拟地址空间内跨语言共享 Arrow 数据与元数据——它由两个 C 风格结构体构成ArrowArray数据与ArrowSchema元数据。MATLAB → Python 方向调用arrow.Array的exportToCDataInterface方法把其包装的 Arrow 内存导出为 C Data Interface 格式返回两个结构体的内存地址。这些地址可以直接传给 Python无需复制底层 Arrow 数据结构随后用 PyArrow 的静态方法py.pyarrow.Array._import_from_c包装ArrowArray指向的数据已是 Arrow Columnar Format并从ArrowSchema提取元数据即可创建pyarrow.Array% Create a MATLAB arrow.Array. AA arrow.array([1, 2, 3, 4, 5]); % Export the MATLAB arrow.Array to the C Data Interface format, returning the % memory addresses of the required ArrowArray and ArrowSchema C-style structs. [arrayMemoryAddress, schemaMemoryAddress] AA.exportToCDataInterface(); % Import the memory addresses of the C Data Interface format structs to create a pyarrow.Array. PA py.pyarrow.Array._import_from_c(arrayMemoryAddress, schemaMemoryAddress);Python → MATLAB 方向先用 PyArrow 的_export_to_c把pyarrow.Array导出到 C Data Interface 格式再把两个结构体的内存地址传给静态方法arrow.Array.importFromCDataInterface零拷贝构造 MATLABarrow.Array。下面的示例改编自 PyArrow 的test_cffi.py测试用例% Make a pyarrow.Array. PA py.pyarrow.array([1, 2, 3, 4, 5]); % Create ArrowArray and ArrowSchema C-style structs adhering to the Arrow C Data Interface format. array py.pyarrow.cffi.ffi.new(struct ArrowArray*) arrayMemoryAddress py.int(py.pyarrow.cffi.ffi.cast(uintptr_t, array)); schema py.pyarrow.cffi.ffi.new(struct ArrowSchema*) schemaMemoryAddress py.int(py.pyarrow.cffi.ffi.cast(uintptr_t, schema)); % Export the pyarrow.Array to the C Data Interface format, populating the required ArrowArray and ArrowShema structs. PA.export_to_c(arrayMemoryAddress, schemaMemoryAddress) % Import the C Data Interface structs to create a MATLAB arrow.Array. AA arrow.Array.importFromCDataInterface(arrayMemoryAddress, schemaMemoryAddress);仓库中的落地证据当前仓库已实现 C Data Interface 的导入路径。matlab/src/cpp/arrow/matlab/c/proxy/array_importer.h 定义了ArrayImporterproxy负责把 C Data Interface 格式的ArrowArray结构体导入为 MATLAB 可用的arrow.c.Array对应的 MATLAB 包装类见 matlab/src/matlab/arrow/c/Array.m它通过 proxy 的getAddress暴露底层结构体地址。导入器内部实现位于 matlab/src/matlab/arrow/c/internal/ArrayImporter.m回环测试见 matlab/test/arrow/c/tRoundTrip.m。进程外共享Memory-Mapped IPC File对于多进程数据处理流水线中的大表设计文档推荐另一条路径先把arrow.Table序列化为Arrow IPC File Format再由另一个进程中的 PyArrow 对该文件做内存映射memory-map零拷贝读取。由于 IPC File Format 与内存中的 Arrow 格式在磁盘上是 1:1 映射内存映射读取时无需自定义反序列化/转换因而性能极高。% Create a MATLAB arrow.Table. Var1 arrow.array([foo, bar, baz]); Var2 arrow.array([today, today 1, today 2]); Var3 arrow.array([10, 20, 30]); AT arrow.Table(Var1, Var2, Var3); % Write the MATLAB arrow.Table to the Arrow IPC File Format on disk. arrow.ipcwrite(AT, data.arrow); % Run Python in a separate process. pyenv(ExecutionMode, OutOfProcess); % Memory map the Arrow IPC File. memoryMappedFile py.pyarrow.memory_map(data.arrow); % Construct pyarrow.ipc.RecordBatchFileReader to read the Arrow IPC File. recordBatchFileReader py.pyarrow.ipc.open_file(memoryMappedFile); % Read all record batches from the Arrow IPC File in one-shot and return a pyarrow.Table. PAT recordBatchFileReader.read_all()仓库中的落地证据IPC 读写功能在仓库中已具雏形C proxy 位于 matlab/src/cpp/arrow/matlab/io/ipc/proxy/record_batch_file_reader与record_batch_file_writerMATLAB 侧包装见 matlab/src/matlab/arrow/io/ipc/对应测试为 matlab/test/arrow/io/ipc/tRecordBatchFileWriter.m 与 matlab/test/arrow/io/ipc/tRecordBatchFileReader.m。值得注意的是实际实现的表对象位于arrow.tabular包如 matlab/src/matlab/arrow/tabular/RecordBatch.m、Table.m、Schema.m与设计文档中的顶层命名arrow.Table、arrow.RecordBatch有所调整。测试策略设计文档要求至少建立三部分测试基础设施MATLAB 类式单元测试MATLAB Class-Based Unit TestsMATLAB CI 工作流MATLAB CI Workflows集成测试Integration Testing对接 Arrow 生态的跨语言集成测试框架。一个实用的技巧要测试内部 C 代码可以用一个MEX 函数从 MATLAB 类式单元测试中调用 C 代码从而把 C 逻辑纳入 MATLAB 测试体系。仓库中的落地证据matlab/test/ 目录下是完整、按包组织的类式测试套件覆盖数组arrow/array/tFloat64Array.m、tStringArray.m等、类型arrow/type/、表arrow/tabular/、缓冲区arrow/buffer/tBuffer.m、CSV/Feather/IPC 读写以及 C Data Interfacearrow/c/tRoundTrip.m。此外 matlab/doc/testing_guidelines_for_the_matlab_interface_to_apache_arrow.md 还提供了更细化的测试规范文档。文档计划为保证可用性、可发现性与可访问性设计文档规划了以下文档产出MATLAB API 的Help TextMATLAB API 参考手册MATLAB 与 C API 的使用示例构建与安装的 README构建系统文档CI 集成文档。安装与构建设计愿景Add-On Explorer 一键安装设计文档希望 MATLAB 用户无需编译 MEX 函数或做任何手动配置就能安装接口最理想的形态是通过 MATLAB 的Add-On Explorer安装——这与 JavaScript 用户通过npm安装apache-arrow包、Rust 用户通过cargo安装arrowcrate 的体验类似。短期计划则是在没有可直接安装的 MATLAB Add-On 之前在仓库中维护清晰的最新构建/安装说明并通过 CI 定期为 Windows、Mac、Linux 构建预编译的 MEX 函数让用户无需从零手动编译即可体验最新功能。当前仓库的构建与安装方式matlab/README.md 给出了当前实际的构建流程。前置依赖MATLAB、CMake、支持 C17 的编译器Linux 上如gccmacOS 上如 XcodeWindows 上如 Visual Studio、Git。$ git clone https://github.com/apache/arrow.git $ cd arrow/matlab$ cmake -S . -B build $ cmake --build build --config Release安装到系统默认软件位置Linux 为/usr/localWindows 为C:\Program Files时传入--target install$ cmake --build build --config Release --target install安装步骤会把安装目录加入 MATLAB Search Path。若当前用户权限不足导致失败可用addpath手动添加安装目录。运行测试则需在arrow/matlab目录下启动 MATLAB执行 runtests(test, IncludeSubFolderstrue);构建系统要点matlab/CMakeLists.txt 展示了底层机制——它通过 CMakeExternalProject_Add自动从../cpp目录构建 Arrow C 共享库开启ARROW_CSV、ARROW_BUILD_STATICOFF并通过find_package(Matlab REQUIRED)获取 MATLAB MEX 库与头文件若环境变量ARROW_HOME或Arrow_ROOT已指向预构建的 Arrow 安装则可跳过内置 Arrow 构建。安装时还可通过MATLAB_ADD_INSTALL_DIR_TO_SEARCH_PATH与MATLAB_ADD_INSTALL_DIR_TO_STARTUP_FILE两个 CMake 选项控制是否直接把安装目录加入 MATLAB Search Path 或写入startup.m底层由 matlab/tools/UpdateMatlabSearchPath.cmake 脚本执行。Roadmap能力规划时间表设计文档给出的高层面路线图如下能力对应用例时间框架Arrow 内存交互Arrow Memory InteractionUC1近期Near Term文件读写File Reading/WritingUC2近期Near Term进程内/进程外内存共享In/Out-of-Process Memory SharingUC3中期Mid Term对照当前仓库状态可以看到UC1数组/类型/字段/模式体系、UC2Feather V1 读写、CSV 与 IPC 读写以及 UC3 的 C Data Interface 导入路径均已实现或具备雏形——matlab/README.md 明确列出当前支持的能力ArrowArray与 MATLAB 数组类型互转、MATLABtable与arrow.tabular.RecordBatch互转、创建 Field/Schema/Type以及读写 Feather V1 文件。设计文档中的arrow.FeatherTableWriter、arrow.matlab2arrow、arrow.ipcwrite等命名在实现中演化为featherwrite/featherread高层函数与arrow.tabular、arrow.io等包结构但MATLAB 对象 C proxy 桥接 Arrow C 库的总体架构与设计文档完全一致。结语这份设计文档的价值在于它清晰地刻画了 MATLAB 接口的三层递进能力从 Arrow 内存交互UC1到文件序列化UC2再到跨语言零拷贝共享UC3并配套了完整的 MATLAB/C 双层 API 设计、测试、文档与安装规划。结合当前仓库的源码实现matlab/src/matlab/arrow/ 与 matlab/src/cpp/arrow/matlab/和测试套件matlab/test/开发者既可以按文档给出的代码示例快速上手也可以沿着高级用户工作流的路径利用unwrap_table/wrap_table与 C Data Interface 构建属于自己的 MATLAB ↔ 其他语言的高效数据通路。赞分享数据工程数据分析大数据【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址https://gitcode.com/gh_mirrors/arrow12/arrow点击查看免费下载相关推荐基于 Apache Arrow 的 MATLAB 接口设计指南从 arrow.* 包到跨语言零拷贝内存共享基于 Apache Arrow 的 MATLAB 接口设计指南从 arrow. 包到跨语言零拷贝内存共享 Apache Arrow 是一个面向加速数据交换与内数据工程大数据序列化数据分析Apache Arrow MATLAB 接口设计解析从 C 内存直通到跨语言零拷贝共享Apache Arrow MATLAB 接口设计解析从 C 内存直通到跨语言零拷贝共享 本文以 Apache Arrow 仓库中的 MATLAB 接口设计大数据数据分析数据工程序列化QUANTAXIS QADataBridge 跨语言零拷贝数据桥接层基于 Apache Arrow 的共享内存通信实战指南QUANTAXIS QADataBridge 跨语言零拷贝数据桥接层基于 Apache Arrow 的共享内存通信实战指南 导读 本文围绕 QUANTAXIS金融科技后端数据分析上一篇JXBanner 开源项目教程下一篇LVGLBuilder项目安装与使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表