当前位置: 首页 > news >正文

使用流式函数解决v语言zstd程序解压缩失败问题

上文的简易压缩/解压程序在解压缩较大文件时出错,输出到文件为0字节。

请输入要解压的.zst文件路径: vzstd.zst
请输入解压后文件保存路径: var.txt
正在解压 vzstd.zst...
解压完成!
压缩文件: vzstd.zst (88089043 字节)
解压文件: var.txt (0 字节)        <---------------no data in output file
耗时: 0.43

我在github上提出此问题,
kbkpbot 回答如下

os.write_bytes(output_file, decompressed_data)

For small zstd file, you can use compress()/decompress() directly.
For large zstd file, because V internal array size limit(it use int which has a limit), you can’t use a supper large buffer now, I suggest use a stream mode compress/decompress.

并提供了解决此问题的具体改用流式函数实现,

const buf_in_size = 1024 * 1024
const buf_out_size = 1024 * 1024fn decompress_file_fun(fname string, oname string, params zstd.DecompressParams) ! {mut fin := os.open_file(fname, 'rb')!mut fout := os.open_file(oname, 'wb')!defer {fin.close()fout.close()}mut buf_in := []u8{len: buf_in_size}mut buf_out := []u8{len: buf_out_size}mut dctx := zstd.new_dctx(params)!defer {dctx.free_dctx()}mut input := &zstd.InBuffer{src:  buf_in.datasize: 0pos:  0}mut output := &zstd.OutBuffer{dst:  buf_out.datasize: 0pos:  0}mut last_ret := usize(0)for {read_len := fin.read(mut buf_in)!input.src = buf_in.datainput.size = usize(read_len)input.pos = 0for input.pos < input.size {output.dst = buf_out.dataoutput.size = buf_out_sizeoutput.pos = 0ret := dctx.decompress_stream(output, input)!fout.write(buf_out[..output.pos])!last_ret = ret}if read_len < buf_in.len {break}}if last_ret != 0 {/* The last return value from DecompressStream did not end on a* frame, but we reached the end of the file! We assume this is an* error, and the input was truncated.*/return error('EOF before end of stream: ${last_ret}')}
}

将此函数添加到源代码,并在decompress_file函数中用如下语句调用代替原有解压缩部分代码。

    println("正在解压 ${input_file}...")start_time := time.now()decompress_file_fun(input_file, output_file)or {} //or {}必须,否则编译出错duration := time.since(start_time).seconds()

这样就可以解压缩完成了

v -prod vzstd2.v./vzstd2
ZSTD 压缩/解压工具
1. 压缩文件
2. 解压文件
3. 退出程序
请选择操作 (1-3): 2
请输入要解压的.zst文件路径: vzstd2.zst
请输入解压后文件保存路径: ccc.txt
正在解压 vzstd2.zst...
解压完成!
压缩文件: vzstd2.zst (88089043 字节)
解压文件: ccc.txt (106046919 字节)
耗时: 0.78
http://www.dtcms.com/a/322605.html

相关文章:

  • react 常用组件库
  • 下肢康复机器人机械结构设计cad【6张】三维图+设计说明说书
  • web应用服务器tomcat
  • 算法_python_牛客华为机试笔记_01
  • 算法篇----分治(快排)
  • Amazon Linux 训练lora模型的方式
  • 【Canvas与旗帜】圆角蓝底大黄白星十一红白带旗
  • sqli-labs通关笔记-第39关 GET数值型堆叠注入(手工注入+脚本注入两种方法)
  • 【Linux】Tomcat
  • 2025年华数杯评审标准发布
  • 企业WEB服务器nginx新手超详细讲解
  • Docker 搭建 Jenkins 实现自动部署!
  • jenkins-飞书通知机制
  • STM32 外设驱动模块四:光敏电阻(LDR) 模块
  • Linux网络编程:TCP的远程多线程命令执行
  • Ollama 开启远程端口
  • 闲鱼智能监控机器人:基于 Playwright 与 AI 的多任务监控分析工具
  • Kubernetes 集群密钥与机密管理方案对比分析:Vault、Sealed Secrets 与 AWS KMS
  • dokcer 容器里面安装vim 编辑器
  • ruoyi关闭shiro校验,任何接口可以直接访问
  • 202506 电子学会青少年等级考试机器人五级器人理论真题
  • 【工具变量】地级市固定资产投资数据(2000-2023年)
  • 大模型在垂直场景的创新应用:搜索、推荐、营销与客服新玩法
  • LabVIEW用户事件交互
  • 【Datawhale AI夏令营】从Baseline到SOTA:深度剖析金融问答RAG管道优化之路
  • 鸿蒙示例代码使用心得
  • 华为实验: 单区域/多区域OSPF
  • n8n飞书webhook配置(飞书机器人、飞书bot、feishu bot)Crypto节点、js timestamp代码、Crypto node
  • 算法_python_学习记录_01
  • 可泛化双手操作机器人基准测试:CVPR 2025 MEIS 研讨会 RoboTwin 双臂协作挑战赛