通过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大文件,提升存储和读取性能。