如何将10GB大JSON文件分割为300-350MB的有效分片文件?
分割大尺寸行式JSON文件为指定大小范围的分片
问题描述
有一个约10GB的JSON文件,格式为每行一个独立JSON对象,示例如下:
{"id":1, "attributes":{"a": 1}} {"id":2, "attributes":{"a": 4, "b": 5, "d": 6}} {"id":2, "attributes":{"a": 4, "b": 5, "c": 6, "d": 5, "e": 1}} {"id":2, "attributes":{"a": 4, "b": 5, "c": 6, "d": 5, "e": 1, "h": "l"}}
需要将其分割为多个大小在300-350MB范围内的文件。尝试使用split命令的两种方式均未达预期:
split -l 5000000 test.json:由于每行JSON大小差异大,分片文件大小可能超出或低于目标范围split -b 300MB test.json:会直接截断JSON行,导致分片文件中的JSON不完整
解决方案:用Python脚本实现按大小范围分割(保证行完整性)
split无法同时满足「大小范围控制」和「不截断JSON行」的需求,可通过Python脚本逐行读取源文件,动态控制输出文件的大小,确保每个分片都落在目标范围内且包含完整的JSON行。
脚本代码
import os def split_large_json(input_file, min_size_mb=300, max_size_mb=350): min_size = min_size_mb * 1024 * 1024 max_size = max_size_mb * 1024 * 1024 file_counter = 1 current_size = 0 output_file = open(f"split_{file_counter:03d}.json", "w", encoding="utf-8") with open(input_file, "r", encoding="utf-8") as f: for line in f: line_size = len(line.encode("utf-8")) # 仅当当前文件已达最小阈值,且新增行将超过最大阈值时,切换新文件 if current_size + line_size > max_size and current_size >= min_size: output_file.close() file_counter += 1 output_file = open(f"split_{file_counter:03d}.json", "w", encoding="utf-8") current_size = 0 output_file.write(line) current_size += line_size output_file.close() print(f"分割完成,共生成{file_counter}个文件") if __name__ == "__main__": split_large_json("test.json")
脚本说明
- 按字节计算文件大小,避免字符编码导致的大小误差
- 严格控制分片大小在300-350MB之间:只有当前文件达到最小阈值后,新增行超过最大阈值时才切换文件
- 输出文件按
split_001.json、split_002.json命名,便于顺序处理 - 逐行读取源文件,内存占用极低,适配10GB级别的大文件
使用方法
- 将代码保存为
split_json.py - 在终端运行:
python split_json.py - 脚本自动读取当前目录下的
test.json并生成符合要求的分片文件
备选方案:用awk实现命令行级别的分割
如果偏好命令行工具,可使用awk脚本实现相同逻辑:
BEGIN { min_size = 300 * 1024 * 1024 max_size = 350 * 1024 * 1024 file_num = 1 current_size = 0 out_file = sprintf("split_%03d.json", file_num) } { line_size = length($0) + 1 # 包含换行符的字节大小 if (current_size + line_size > max_size && current_size >= min_size) { close(out_file) file_num++ out_file = sprintf("split_%03d.json", file_num) current_size = 0 } print > out_file current_size += line_size } END { close(out_file) printf("分割完成,共生成%d个文件\n", file_num) }
使用方法
- 将代码保存为
split_json.awk - 在终端运行:
awk -f split_json.awk test.json
内容的提问来源于stack exchange,提问作者Dung Pham
相关产品推荐
相关产品推荐

