通過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大文件,提升存儲和讀取性能。