Apache Arrow .NET
面向 .NET 的 Arrow 实现。
请参阅我们当前的功能矩阵,了解当前可用的功能。
实现
- Arrow 规范 1.0.0。(支持读取 0.11+。)
- C# 11
- .NET Standard 2.0、.NET 6.0、.NET 8.0 和 .NET Framework 4.6.2
- 异步 I/O
- 使用现代 .NET 运行时功能,例如用于内存分配、内存存储和快速序列化的 Span<T>、Memory<T>、MemoryManager<T> 和 System.Buffers 原语。
- 使用非循环访问者模式处理数组类型和数组,以方便序列化、记录批处理遍历和格式增长。
已知问题
- 无法读取包含张量的 Arrow 文件。
- 如果不实现自定义内存池,则无法轻松修改分配策略。所有分配目前都按 64 字节对齐并填充到 8 字节。
- 默认内存分配策略使用带有指针修复的超额分配策略,这会导致小缓冲区出现显着的内存开销。一个需要单个字节存储的缓冲区可能由多达 64 字节的分配支持,以满足对齐要求。
- 目前,可用于特定数组类型的生成器 API 很少。数组必须使用 arrow 缓冲区生成器抽象手动构建。
- FlatBuffer 代码生成未包含在构建过程中。
- 序列化实现在某些情况下不会在反序列化过程中执行详尽的验证检查。
- 在许多情况下会抛出消息模糊、不一致或未本地化的异常
- 在某些情况下,会抛出与 Arrow 实现不特定的异常(例如,不抛出 ArrowException 异常)
- 缺少代码文档
- 缺少使用示例
用法
使用 ArrowFileReader 从 Arrow IPC 文件读取 RecordBatches 的示例
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using Apache.Arrow;
using Apache.Arrow.Ipc;
public static async Task<RecordBatch> ReadArrowAsync(string filename)
{
using (var stream = File.OpenRead(filename))
using (var reader = new ArrowFileReader(stream))
{
var recordBatch = await reader.ReadNextRecordBatchAsync();
Debug.WriteLine("Read record batch with {0} column(s)", recordBatch.ColumnCount);
return recordBatch;
}
}
状态
内存管理
- 分配按 64 字节对齐并填充到 8 字节。
- 分配会自动进行垃圾回收
数组
基本类型
- Int8, Int16, Int32, Int64
- UInt8, UInt16, UInt32, UInt64
- Float, Double, Half-float (.NET 6+)
- Binary (可变长度)
- String (utf-8)
- Null
参数化类型
- Timestamp
- Date32, Date64
- Decimal32, Decimal64, Decimal128, Decimal256
- Time32, Time64
- Binary (固定长度)
- 列表
- 结构体
- 联合
- Map
- 持续时间
- 间隔
类型元数据
序列化
IPC 格式
压缩
- 支持缓冲区压缩和解压缩,但这需要安装
Apache.Arrow.Compression包。读取压缩数据时,您必须将 CompressionCodecFactory 实例传递给 ArrowFileReader 或 ArrowStreamReader 构造函数,并且在写入压缩数据时,必须在 IpcOptions 中设置 CompressionCodecFactory。或者,也可以使用 ICompressionCodecFactory 的自定义实现。