Julia中如何高效修改JSON文件?求替代读删重写的方案
优化Julia中JSON文件追加更新的实现方式
首先你的现有代码存在作用域问题:在open("RayDictionary.txt","r") do file块内定义的d,在块外无法访问,执行merge!(d,newentry)会直接报错,先修复这个基础问题。
针对你的需求(保留历史结果,每次追加新条目到JSON对象),以下是几种更优的实现方式:
方式一:优化全量读写逻辑(最稳妥的对象更新方案)
因为JSON对象({...})的结构决定了无法直接在文件末尾追加键值对(会破坏JSON格式),所以必须读全量数据合并后重新写入,但可以简化IO操作,无需删除原文件:
using JSON newentry = Dict(string(θ) => list[end].legs[2][1]/2.0) # 处理文件不存在的情况,初始化空字典 if isfile("RayDictionary.txt") d = open(JSON.parse, "RayDictionary.txt", "r") else d = Dict() end merge!(d, newentry) # 直接用"w"模式覆盖写入,无需删除文件 open("RayDictionary.txt", "w") do file JSON.print(file, d, 2) end
方式二:改用JSON数组结构实现真正的追加(适合条目独立的场景)
如果你的计算结果可以组织为数组元素(而非对象的键值对),可以直接在文件末尾追加内容,避免全量读取,性能更优:
初始化文件(首次运行)
open("RayArray.txt", "w") do file JSON.print(file, [], 2) end
每次追加新条目
using JSON newentry = list[end].legs[2][1]/2.0 # 单个结果或自定义结构 open("RayArray.txt", "r+") do file # 移动到文件倒数第二个字符(跳过数组末尾的"]") seekend(file) skip(file, -1) # 处理是否是第一个元素 if position(file) == 0 # 文件为空,直接写入第一个元素 JSON.print(file, [newentry], 2) else # 追加逗号和新元素,再补"]" write(file, ",\n ") JSON.print(file, newentry) write(file, "\n]") end end
方式三:使用性能更优的JSON库
如果处理的数据集较大,推荐使用JSON3.jl替代JSON.jl,它的解析和序列化速度更快,逻辑和上面一致:
using JSON3 newentry = Dict(string(θ) => list[end].legs[2][1]/2.0) d = isfile("RayDictionary.txt") ? JSON3.read(read("RayDictionary.txt"), Dict) : Dict() merge!(d, newentry) write("RayDictionary.txt", JSON3.pretty(d))
内容的提问来源于stack exchange,提问作者jephwack
相关产品推荐
相关产品推荐

