You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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级别的大文件

使用方法

  1. 将代码保存为split_json.py
  2. 在终端运行:python split_json.py
  3. 脚本自动读取当前目录下的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)
}

使用方法

  1. 将代码保存为split_json.awk
  2. 在终端运行:awk -f split_json.awk test.json

内容的提问来源于stack exchange,提问作者Dung Pham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:42:50