本文主要介绍 tosfsspec 的进阶能力,聚焦高性能、数据一致性以及特定业务场景的实践需求。
处理大文件时,tosfsspec 会自动启用分片(Multipart)机制,将文件拆分为多个部分并行传输,以提升速度与稳定性。
分片大小 (part_size 和 block_size)
- TosFileSystem(part_size=...):初始化 TosFileSystem 时设置的 part_size 是全局默认值,主要影响 cp_file 等涉及服务端复制/分片复制的操作。
- fs.open(..., block_size=...):在 open() 方法中的 block_size 更为常用,直接决定写入 (wb, ab) 或读取 (rb) 文件时的缓冲块大小。
- block_size 决定每次向 TOS 上传的分片大小。为满足 TOS 要求,该值必须大于等于 4MB;未显式设置时,则使用 TosFileSystem 的 part_size。
说明
写入大文件时,建议将 block_size 设置为 8MB~128MB 之间,具体取决于网络状况和文件大小。大多数场景可从 8MB 起步。
- block_size 决定了每次从 TOS 下载的数据块大小,即是执行 file.read(size) 时,底层客户端预取的数据量。合理的 block_size 可以优化随机读性能。
tosfsspec 底层使用高性能内核执行高并发网络请求,可通过初始化参数调整并发池规模。
- shared_prefetch_tasks:读取数据时的预拉取任务并发数。
- shared_upload_part_tasks:分片上传任务并发数。
- shared_upload_part_copy_tasks:分片复制任务并发数。
提高并发可增加并行度,在网络条件良好时可能提升传输速度,但也会带来更高的 CPU 与内存开销。代码示例如下所示:
tosfsspec 支持以追加模式(ab)打开对象,适用于持续写入日志、增量更新等场景;底层依赖 TOS 的 AppendObject 能力。代码示例如下所示:
注意
追加写要求目标对象必须为 Appendable 类型。tosfsspec 在首次以 wb 创建对象时,默认会创建可追加对象;若对非可追加对象(例如由其他工具上传的普通对象)执行追加,可能失败。
上传对象时,tosfsspec 会尝试自动推断 Content-Type(MIME 类型),便于浏览器等客户端按正确类型访问。
- put_file():根据本地文件的扩展名自动推断。
- open(..., 'wb') 或 touch():根据对象 Key 的扩展名自动推断。
如需覆盖自动推断,可在 open()、touch() 或 put_file() 中通过 ContentType 参数进行显式覆盖指定。代码示例如下所示:
默认情况下,enable_crc=True,tosfsspec 会在数据传输完成后使用 CRC64 校验,确保本地与远端数据一致,提供强有力的数据完整性保障。若对性能要求极高且可接受极低概率的数据损坏风险,可关闭该校验。代码示例如下所示:
TOS Bucket 主要有两类:
- FNS (Flat Namespace):扁平命名空间,所有对象都在一个层级,目录结构是模拟的。
- HNS (Hierarchical Namespace):分层命名空间,提供原生目录结构,性能更优,体验类似于 HDFS。
tosfsspec 对这两种类型都提供支持,但在某些操作上存在差异:
- mv():在 HNS bucket 内移动目录是原子操作,效率更高。在 FNS bucket 内则需要逐一复制再删除。
- walk(), find(), rm(), copy():递归操作中的 maxdepth 参数用于限制递归深度。此参数仅在 FNS 类型的 Bucket 中有效。在 HNS Bucket 中使用 maxdepth 会引发 ValueError,因为 HNS 的原生目录遍历机制不支持该限制。