-
Notifications
You must be signed in to change notification settings - Fork 285
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
parallel suffix tree sort optimize diff speed #18
Comments
sais本来就不算很快吧 |
最近会试试libdivsufsort; 补充: 已经完成libdivsufsort的支持,而且默认支持开启宏_OPENMP时支援openMP并行; |
试了msufsort4,在xcode中单线程ok(速度和libdivsufsort相当),多线程运行时异常; |
他的算法肯定是专门为并行设计的,作者自己的benchmark说是比divsufsort的multithread快好几倍
|
看数据msufsort4多线程确实很快,但我在xcode下多线程版本内存访问异常:( ,单线程没有问题, 不知道是不是我为了能够编译过而做的小改动造成的; |
msufsort4当前新版本的测试情况是单线程正常,多线程并行一部分用例正常(偏小数据量)部分崩溃(函数堆栈溢出?),已经把用例反馈给作者。 |
msufsort4 is very slow in some case(like GCC12.2SourceCode.tar) , build by vc2019; so continure used libdivsufsort(openmp changed to std::thread). |
@sisong 看了hdiff的block 模式的算法, block算出来的指纹值 进行后缀排序, |
谢谢 @rongekuta 提供的信息 可以尝试倍增法来优化速度,因为无法使用基数排序(单字符为uint64),估计算法复杂度一般为: |
have you tried https://github.com/IlyaGrebnov/libsais |
@JayXon |
@rongekuta 我实现了一个后缀数组倍增算法的版本,输出的补丁数据一致; 速度比我现在已有的版本(单线程时)还慢很多。
|
I test two case
Considering libsais's license and thread mode, so keep divsufsort now. close #322 |
good job! 最近的测试给了我一些想法(也许利用Rabin–Karp 算法 比后缀数组更快): 有位同事提到了 zstd 也支持patch模式 表1 算法patch时间与效果 表2 算法的apply 时间对比 zstd 的算法是lz77 算法, 不用后缀数组(后缀数组看起来性能开销还是挺大) 我觉得很有意思, 有可能不走 后缀数组排序 这种大杀器, 只是利用 Rabin–Karp 算法(lz77用到的字符串匹配) |
|
PS: 对比1.8GB文件采用的是 hdiff 64字节分块模式 |
@sisong 因为hdiff的内存限制机制 还有可扩展框架 适合 移动设备使用 想法是遍历old文件采用固定长度(8字节)计算hash值,存到hash表, new文件也进行滑块hash,并在hash表中查找,并且匹配 思路除了后缀排序有点类似 hdiff 的block模式, 应该在博客中你也谈到了这个思路,但是考虑到hash表内存占用,没有利用这个思路。 |
@rongekuta 你说的这个思路,在压缩算法中很通用,但和我的设计目标有冲突: |
@sisong PS: |
当前的-m diff约一半以上时间消耗在后缀数组排序上;可以考虑并行实现。
一种是增加一个接口,支持外部用多线程环境并行调用;另外就是内置并行代码(当前的想法是同时支持单线程、openMP、pthread、C++11thread可选);
The text was updated successfully, but these errors were encountered: