递归火山软件开发平台

标题: 已删除 [打印本页]

作者: aixunsoft    时间: 2025-2-5 02:17
标题: 已删除
本帖最后由 aixunsoft 于 2025-3-3 14:59 编辑

已删除
作者: urenai    时间: 2025-2-5 14:29
大兄弟你能给他封个源码版的吗?

还有你搞个 17- 的
这得升级到vs2022啊

还有,原版中可以设定多线程的线程数,你这个也没预留参数啊。
作者: kingsoft    时间: 2025-2-5 14:56
老大加油优化一下,远程桌面就靠你们两个了!
作者: aixunsoft    时间: 2025-2-5 16:17
urenai 发表于 2025-2-5 14:29
大兄弟你能给他封个源码版的吗?

还有你搞个 17- 的

重新上传封了一个类,一个对象一个上下文,频繁压缩解压的话,速度可能会快一点,至于说多线程压缩,应该是指的可以多个线程同时压缩数据,并不是一个数据多个线程压缩,内部带了线程池,整个zstd的头文件也没找到可以设置线程数的函数,但是里面有一个线程池,并且内部创建了线程池,源码文件太多了,不适合全部包进去,库是vs2022编译的,把限制17删掉看看能不能兼容2019。
作者: htpmcj    时间: 2025-2-5 16:36
支持一下
作者: aixunsoft    时间: 2025-2-5 17:29
据说lz4压缩更快,但是压缩率差一点
作者: Xelloss0618    时间: 2025-2-5 18:13
aixunsoft 发表于 2025-2-5 16:17
重新上传封了一个类,一个对象一个上下文,频繁压缩解压的话,速度可能会快一点,至于说多线程压缩,应该 ...

高版本可以兼容低版本编译的LIB,反过来不行
作者: urenai    时间: 2025-2-6 20:15
大哥 你能不能放源码版本出来,

有选择的话,肯定源码版优先啊
作者: aixunsoft    时间: 2025-2-6 20:38
urenai 发表于 2025-2-6 20:15
大哥 你能不能放源码版本出来,

有选择的话,肯定源码版优先啊

你说的源码是指直接引用zstd源码,还是火山的源码,zstd源码太多了不好引用,火山模块安装完就是源码,你也可以自己复制出来写到你自己项目上面,代码没几行,zstd编译很简单的,你可以自己用vs2019编译,下载zstd源码,build-VS2010,用vs2019打开,然后右键动态库和静态库直接生成把文件复制出来在火山引用就可以了。
作者: aixunsoft    时间: 2025-2-6 20:39
urenai 发表于 2025-2-6 20:15
大哥 你能不能放源码版本出来,

有选择的话,肯定源码版优先啊

<火山程序 类型 = "通常" 版本 = 1 />

包 星火.zstd

类 ZSTD <公开 @全局类 = 真 @视窗.头文件搜寻目录 = "zstd\\include" @视窗.外部头文件 = "zstd.h"
        @视窗.附属文件.non_static = "zstd\\$(p)\\$(d)\\dynamic\\bin\\zstd.dll"
        @视窗.外部库 = "zstd\\$(p)\\$(d)\\$(lm)\\lib\\zstd.lib" "" "@视窗.外部库.debug-static" = "msvcrtd.lib"
        "@视窗.外部库.release-static" = "msvcrt.lib" "" @视窗.需求VS版本.static = "17-">
{
    方法 ZSTD_取版本 <公开 静态 类型 = 文本型 @嵌入式方法 = "">
    {
        @ CVolString(ZSTD_versionString())
    }

    方法 ZSTD_压缩 <公开 静态 类型 = 字节集类 折叠>
    参数 欲压缩数据 <类型 = 字节集类>
    参数 压缩等级 <类型 = 整数 注释 = "1-22,默认3" @默认值 = 3>
    {
        变量 结果 <类型 = 字节集类>
        @ @<结果>.Alloc (ZSTD_compressBound(@<欲压缩数据>.GetSize ()), false);
        @ size_t compressedSize = ZSTD_compress(@<结果>.GetPtr(), @<结果>.GetSize (),@<欲压缩数据>.GetPtr(), @<欲压缩数据>.GetSize(), @<压缩等级>);
        @ if (ZSTD_isError(compressedSize))return CVolMem();
        @ @<结果>.Realloc (compressedSize);
        返回 (结果)
    }

    方法 ZSTD_解压 <公开 静态 类型 = 字节集类 折叠>
    参数 欲解压数据 <类型 = 字节集类>
    {
        变量 结果 <类型 = 字节集类>
        @ @<结果>.Alloc (ZSTD_getDecompressedSize(@<欲解压数据>.GetPtr(), @<欲解压数据>.GetSize()), false);
        @ if (ZSTD_isError(ZSTD_decompress(@<结果>.GetPtr(), @<结果>.GetSize (), @<欲解压数据>.GetPtr(), @<欲解压数据>.GetSize())))return CVolMem();
        返回 (结果)
    }
}

类 zstd压缩类 <公开 注释 = "适合连续压缩数据,一个对象只能同时被一个线程操作" @强制依赖 = "ZSTD">
{

    # @begin
    # <> <include>
    #     ZSTD_CCtx* cctx;
    # <> </include>
    # @end

    方法 类_初始化
    {
        @ cctx = ZSTD_createCCtx();
    }

    方法 类_清理
    {
        @ ZSTD_freeCCtx(cctx);
    }

    方法 压缩等级 <公开 属性写>
    参数 等级 <类型 = 整数 注释 = "默认为3 1到22">
    {
        @ ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, @<等级>);
    }

    方法 线程数 <公开 属性写 @视窗.外部头文件 = "<thread>">
    参数 数量 <类型 = 整数 注释 = "默认为0 单线程,-1为CPU核心数">
    {
        @ if(@<数量> == -1)@<数量> = std::thread::hardware_concurrency();
        @ ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, @<数量>);
    }

    方法 速度 <公开 属性写>
    参数 挡位 <类型 = 整数 注释 = "默认为2 1到9,数值越小,速度越快,压缩比越低">
    {
        @ ZSTD_CCtx_setParameter(cctx, ZSTD_c_strategy, @<挡位>);
    }

    方法 压缩 <公开 类型 = 字节集类>
    参数 欲压缩数据 <类型 = 字节集类>
    参数 压缩等级 <类型 = 整数 注释 = "1-22,默认3" @默认值 = 3>
    {
        变量 结果 <类型 = 字节集类>
        @ @<结果>.Alloc (ZSTD_compressBound(@<欲压缩数据>.GetSize ()) , false);
        @ size_t compressedSize = ZSTD_compress2(cctx, @<结果>.GetPtr(), @<结果>.GetSize (), @<欲压缩数据>.GetPtr(), @<欲压缩数据>.GetSize());
        @ if (ZSTD_isError(compressedSize))return CVolMem();
        @ @<结果>.Realloc (compressedSize);
        返回 (结果)
    }
}

类 zstd解压类 <公开 注释 = "适合连续解压数据,一个对象只能同时被一个线程操作" @强制依赖 = "ZSTD">
{

    # @begin
    # <> <include>
    #     ZSTD_DCtx* dctx;
    # <> </include>
    # @end

    方法 类_初始化
    {
        @ dctx = ZSTD_createDCtx();
    }

    方法 类_清理
    {
        @ ZSTD_freeDCtx(dctx);
    }

    方法 解压 <公开 类型 = 字节集类>
    参数 欲解压数据 <类型 = 字节集类>
    {
        变量 结果 <类型 = 字节集类>
        @ @<结果>.Alloc (ZSTD_getDecompressedSize(@<欲解压数据>.GetPtr(), @<欲解压数据>.GetSize()), false);
        @ size_t decompressedSize = ZSTD_decompressDCtx(dctx, @<结果>.GetPtr(), @<结果>.GetSize (), @<欲解压数据>.GetPtr(), @<欲解压数据>.GetSize());
        @ if (ZSTD_isError(decompressedSize))return CVolMem();
        返回 (结果)
    }
}

作者: aixunsoft    时间: 2025-2-6 20:40
urenai 发表于 2025-2-6 20:15
大哥 你能不能放源码版本出来,

有选择的话,肯定源码版优先啊

(, 下载次数: 16)
这边的库引用改成你自己编译的zstd库文件路径就可以了。

作者: 高山!&流水    时间: 2025-2-6 20:57
谢谢分享
作者: urenai    时间: 2025-2-6 21:31
aixunsoft 发表于 2025-2-6 20:40
这边的库引用改成你自己编译的zstd库文件路径就可以了。

动动小手啊,打包一份
作者: 让我栞栞谁没6星    时间: 2025-2-6 23:20
我一开始也想封一个的,结果失败了,前来学习一下楼主是怎么写的:噜阿噜
作者: lichenxui    时间: 2025-2-7 09:41
66666
作者: aixunsoft    时间: 2025-2-7 18:00
Xelloss0618 发表于 2025-2-5 18:13
高版本可以兼容低版本编译的LIB,反过来不行

有些没有必须vs2022才能编译的代码编译的lib用vs2019是可以运行的,
这个库vs2022编译的,我用火山自带的vs2019静态编译是可以正常运行的,有没有其他副作用就不知道了。
作者: Xelloss0618    时间: 2025-2-7 18:07
aixunsoft 发表于 2025-2-7 18:00
有些没有必须vs2022才能编译的代码编译的lib用vs2019是可以运行的,
这个库vs2022编译的,我用火山自带的 ...

纯C语言的库,的确可以高版本编译,低版本也能用,C++的就不行了
作者: aixunsoft    时间: 2025-2-7 18:12
Xelloss0618 发表于 2025-2-7 18:07
纯C语言的库,的确可以高版本编译,低版本也能用,C++的就不行了

原来如此,受教了
作者: 888888    时间: 2025-2-7 18:59
谢谢分享
作者: 浮云    时间: 2025-2-7 20:23
收藏了

作者: urenai    时间: 2025-2-7 20:47
aixunsoft 发表于 2025-2-7 18:12
原来如此,受教了

受教没用啊老板,你给源码版发出来啊
作者: aixunsoft    时间: 2025-2-7 20:56
urenai 发表于 2025-2-7 20:47
受教没用啊老板,你给源码版发出来啊

发的不是源码吗
作者: aixunsoft    时间: 2025-2-7 20:57
urenai 发表于 2025-2-7 20:47
受教没用啊老板,你给源码版发出来啊

你把限制17那个注释掉,vs2019就可以静态编译了
作者: urenai    时间: 2025-2-7 21:35
aixunsoft 发表于 2025-2-7 20:57
你把限制17那个注释掉,vs2019就可以静态编译了

不依赖你的lib和dll,纯源码版,可以吗?
作者: aixunsoft    时间: 2025-2-7 22:26
urenai 发表于 2025-2-7 21:35
不依赖你的lib和dll,纯源码版,可以吗?

那是zstd的dll和lib,是zstd官方源码编译出来的,你不带的话,你可以尝试把整个zstd源码和头文件包进去试试,但是可能会编译报错。
作者: urenai    时间: 2025-2-7 23:24
aixunsoft 发表于 2025-2-7 22:26
那是zstd的dll和lib,是zstd官方源码编译出来的,你不带的话,你可以尝试把整个zstd源码和头文件包进去试 ...

我设置了线程数=-1
我尝试死循环 重复压缩并没有占用100%

极有可能为正确触发多线程,有空的话,能看看吗?

作者: aixunsoft    时间: 2025-2-8 01:55
urenai 发表于 2025-2-7 23:24
我设置了线程数=-1
我尝试死循环 重复压缩并没有占用100%

设置-1我电脑接近100%,每个核心都用到了,设置大于CPU核心数,稳定100%,如果90%都到不了的话,那就是没正确读取到CPU核心数,变成单线程了
作者: aixunsoft    时间: 2025-2-8 01:57
urenai 发表于 2025-2-7 23:24
我设置了线程数=-1
我尝试死循环 重复压缩并没有占用100%

(, 下载次数: 17) 我电脑测试每个线程都用上了,CPU接近100%,设置线程数大于CPU核心数,比如设置cpu核心数*2,可以稳定100%占用

作者: urenai    时间: 2025-2-9 12:03
aixunsoft 发表于 2025-2-8 01:57
我电脑测试每个线程都用上了,CPU接近100%,设置线程数大于CPU核心数,比如设置cpu核心数*2,可以稳定100 ...

不行,设置了-1 或者 8 都一样,我怀疑是 兼容问题。
看CPU状态,就像 单线程、
作者: 芒g一号    时间: 2025-2-9 19:33
感谢分享!!!
作者: aixunsoft    时间: 2025-2-9 20:54
urenai 发表于 2025-2-9 12:03
不行,设置了-1 或者 8 都一样,我怀疑是 兼容问题。
看CPU状态,就像 单线程、 ...

数据太小,一下子就压缩完了,应该是按段启动线程的,数据太小不会用多线程,小数据多线程没什么意义,启动线程的时间都给压缩完了,压缩大数据会分段多线程压缩。小数据光在那边执行循环了,CPU占用肯定上不去。
作者: qaz2428119    时间: 2025-2-10 10:34
先收藏,以待后用
作者: aycap    时间: 2025-2-11 23:43
6666666
作者: hxk12349    时间: 昨天 12:48
ZSTD解压缩库 [修改]




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4