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 字节。
  • 分配会自动进行垃圾回收

数组

基本类型

参数化类型

类型元数据

序列化

IPC 格式

压缩

未实现

  • 序列化
    • 详尽验证
    • 运行结束编码
  • 类型
    • 张量
  • 数组
  • 数组操作
    • 相等/比较
    • 类型转换
  • 计算
    • 目前没有可用于计算/内核抽象的 API。