珂珂的个人博客 - 一个程序猿的个人网站

谈谈遇到的阿里云OSS的.net sdk坑

      由于需要将文件上传到OSS,于是找来了.net sdk 其实完全可以自己根据API来实现。之前用的2.4.0版本,一直没有更新,使用上没什么大问题,就是在服务器上上传大的文件CPU和内存占用都挺高。

但最近想显示上传进度和速度,我的实现方法是用System.Threading.Timer  每秒根据上传流的Position来判断。上传单个大文件没什么问题,也能显示进度和速度,但有多个零碎小文件的时候,一个文件不到1s就上传完了,这样就不对了,另种方法如果用很小的时间单位来计算速度不会太精确,解决方法是采用不管文件个数,记录所有已经上传的字节数,用当前的字节数减去上一秒记录的字节数就是速度。

    在我用大于2G 的文件测试时,报错算术运算发生溢出,开始以为是Math.Round的问题,最后查到竟然是Aliyun.Oss里面的Util下的OssUtils.cs 的203行,int readSize = (int)partSize;  这个partSize是long类型的,由于2G字节数太大不能转换成Int 而且它是byte[] buffer = new byte[readSize];一次性读完2G 计算MD5想想这种方法显然不可取。于是去官网下载最新版2.8.0发现没这些代码了,但发现这个SDK比2.4.0改动相当多,用之前的方法速度和进度都不会显示,查找原因是上传流的Position始终为0,是它在内部进行了另外的处理。既然这种方法不能实现那么去官网看下SDK文档,果然有显示进度的方法。

    在服务器上运行的时候发现CPU占用非常高,内存占用倒是小了,但是仍然导致服务器很卡,我是单核的,我猜是不是在计算MD5导致非常占用CPU,但是一番查找发现并没有调用MD5计算。经过VS性能分析,发现是CRC64 计算的时候....还在探查中





上一篇:个人代码全部开源

下一篇:谈谈遇到的阿里云OSS的.net sdk坑


0 评论

查看所有评论

给个评论吧