searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

将海量小文件合并为少量FFRecord大文件,提升存储和读取性能

2025-06-06 08:33:25
7
0

通过FFRecord将海量小文件合并为少量大文件的操作步骤如下:


1. 安装FFRecord

# 从GitHub克隆仓库
git clone xxx/HFAiLab/ffrecord.git
cd ffrecord

# 安装依赖和FFRecord包
pip install -r requirements.txt
pip install -e .

2. 准备小文件数据集

将小文件按类别或用途整理到目录中,例如:

input_data/
    ├── image_1.jpg
    ├── image_2.png
    └── ...

3. 编写数据打包脚本

创建Python脚本(如 pack_dataset.py),使用FFRecord API合并文件:

import os
from ffrecord import pack_dataset

def pack_files(input_dir, output_dir, num_partitions):
    # 获取所有小文件路径
    files = []
    for root, _, fnames in os.walk(input_dir):
        for fname in fnames:
            path = os.path.join(root, fname)
            files.append((fname, path))  # (文件名, 文件路径)

    # 打包为FFRecord格式
    pack_dataset(files, output_dir, num_partitions, verbose=True)

if __name__ == "__main__":
    input_dir = "input_data"       # 输入目录
    output_dir = "ffrecord_data"   # 输出目录
    num_partitions = 10            # 生成的大文件数量
    os.makedirs(output_dir, exist_ok=True)
    pack_files(input_dir, output_dir, num_partitions)

4. 运行打包脚本

python pack_dataset.py

生成的文件会保存在 ffrecord_data 目录,格式为:

ffrecord_data/
    ├── PART_00000.ffr
    ├── PART_00001.ffr
    └── ...

5. 验证生成的文件(可选)

使用FFRecord读取接口检查数据完整性:

from ffrecord import FileReader

# 读取示例文件
reader = FileReader("ffrecord_data/PART_00000.ffr")

# 获取第一个样本
filename, data = reader.read(0)
print(f"Filename: {filename}, Data Size: {len(data)} bytes")

关键参数说明

  • num_partitions​: 控制输出大文件数量,根据数据总大小调整(例如10GB数据,设置10个分区,每个约1GB)。
  • 自定义处理​: 可在 pack_dataset 前添加预处理逻辑(如图片压缩)。
  • 元数据存储​: FFRecord自动保存文件名等元信息,无需额外处理。

注意事项

  • 文件顺序​: 数据默认按原始顺序存储,如需打乱需在打包前手动随机化文件列表。
  • 兼容性​: 确保读取代码与生成文件的FFRecord版本一致。
  • 性能优化​: 调整 num_partitions 和并行处理参数以优化I/O效率与内存占用。

通过以上步骤,可高效将海量小文件合并为少量FFRecord大文件,提升存储和读取性能。

0条评论
0 / 1000
阮****标
1文章数
0粉丝数
阮****标
1 文章 | 0 粉丝
阮****标
1文章数
0粉丝数
阮****标
1 文章 | 0 粉丝
原创

将海量小文件合并为少量FFRecord大文件,提升存储和读取性能

2025-06-06 08:33:25
7
0

通过FFRecord将海量小文件合并为少量大文件的操作步骤如下:


1. 安装FFRecord

# 从GitHub克隆仓库
git clone xxx/HFAiLab/ffrecord.git
cd ffrecord

# 安装依赖和FFRecord包
pip install -r requirements.txt
pip install -e .

2. 准备小文件数据集

将小文件按类别或用途整理到目录中,例如:

input_data/
    ├── image_1.jpg
    ├── image_2.png
    └── ...

3. 编写数据打包脚本

创建Python脚本(如 pack_dataset.py),使用FFRecord API合并文件:

import os
from ffrecord import pack_dataset

def pack_files(input_dir, output_dir, num_partitions):
    # 获取所有小文件路径
    files = []
    for root, _, fnames in os.walk(input_dir):
        for fname in fnames:
            path = os.path.join(root, fname)
            files.append((fname, path))  # (文件名, 文件路径)

    # 打包为FFRecord格式
    pack_dataset(files, output_dir, num_partitions, verbose=True)

if __name__ == "__main__":
    input_dir = "input_data"       # 输入目录
    output_dir = "ffrecord_data"   # 输出目录
    num_partitions = 10            # 生成的大文件数量
    os.makedirs(output_dir, exist_ok=True)
    pack_files(input_dir, output_dir, num_partitions)

4. 运行打包脚本

python pack_dataset.py

生成的文件会保存在 ffrecord_data 目录,格式为:

ffrecord_data/
    ├── PART_00000.ffr
    ├── PART_00001.ffr
    └── ...

5. 验证生成的文件(可选)

使用FFRecord读取接口检查数据完整性:

from ffrecord import FileReader

# 读取示例文件
reader = FileReader("ffrecord_data/PART_00000.ffr")

# 获取第一个样本
filename, data = reader.read(0)
print(f"Filename: {filename}, Data Size: {len(data)} bytes")

关键参数说明

  • num_partitions​: 控制输出大文件数量,根据数据总大小调整(例如10GB数据,设置10个分区,每个约1GB)。
  • 自定义处理​: 可在 pack_dataset 前添加预处理逻辑(如图片压缩)。
  • 元数据存储​: FFRecord自动保存文件名等元信息,无需额外处理。

注意事项

  • 文件顺序​: 数据默认按原始顺序存储,如需打乱需在打包前手动随机化文件列表。
  • 兼容性​: 确保读取代码与生成文件的FFRecord版本一致。
  • 性能优化​: 调整 num_partitions 和并行处理参数以优化I/O效率与内存占用。

通过以上步骤,可高效将海量小文件合并为少量FFRecord大文件,提升存储和读取性能。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0