barbruh.22.09.12

sexart的那坨discord drive转onedrive的玩意实在是慢到离谱,30小时才转了600GB,wiebitte?🤔一看日志,发现它果然卡在了4k视频上,有很长一段时间它只在以10MB/s都可能没有的速度,上传一个10GB甚至⑨GB的4k视频文件(恼🤔和度盘还有discord drive不同,onedrive完全不支持多线程上传,所以唯一能够加速它上传的方法只剩下了多线程上传,那么就基本上意味着onedrive上传最理想的场合是上传一系列大小相同或者相近的压缩包(确信🤔

我记得度盘8GB包这种玩意其实是在同时适配旧onedrive,因为那时onedrive的文件大小限制是10GB🤔

现在可能存在一种改进方法,那就是让脚本一次性下载并处理四个sexart视频(确信🤔但这样也许需要对脚本做一番魔改,比如上传onedrive这部分,需要设置成攒够四个视频文件夹才会去执行onedrive上传,不然就只上传guilded,而且还得去除每次开始时删掉整个临时文件夹这一措施🤔

但这种方式有一个问题就是断点续传的时候就比较麻烦了,比如由于各种原因脚本得停一下,那么下次开始时,我是需要将已经下载并上传完guilded但还没有上传onedrive的视频先上传onedrive了,还是手动将list恢复到之前四个视频里的第一个视频那个位置,还是怎么🤔

另外一种方式是直接从list里面抽取开头四个视频,然后在子函数里一次性处理四个视频🤔这样就不会带来什么断点续传问题,但(discord频道上的)结果输出可能就非常蛋疼了,我只能将那四个视频的log一块打出来,没法像之前那样用log的文件名来做一部分说明,也没法做到一个guilded链接对应着一个视频文件夹的名字🤔但我其实也可以用webhook向discord聊天室直接输出结果,而且可以做得很定制化🤔

results

最后我采用了一次处理四个视频的方案,具体来说每次循环前将list里前四个视频链接保存到某个临时文件,然后开始循环,原来的临时文件夹里创建两个文件夹processing和processed,进入processing,再写一个for循环来将它们一个一个一个一个下下来解压然后上传到guilded drive啊啊啊啊啊🤔传完guilded drive之后再将视频文件夹扔进processed,直到四个视频全部传完后,将processed文件夹里的所有东西扔到onedrive上去,然后进行下一个循环🤔

跑了两圈,效果还不错,如果原来处理一个视频需要半小时的话,现在一个小时就可以处理四个视频,最后四个4k视频同时上传的阶段最高速度能达到40MB/s,看上去不错(确信🤔当然中间还翻了一次车,onedrive应该上传35GB东西却只上传了2GB,看了下日志,发现rclone因为内存不足被橄榄了(恼🤔看来,之前200MB分片的确有点多,考虑到调大分片大小基本上不会提高多少速度,而且我现在可以多线程(迫真)了,直接调回来罢🤔

guildedthonk

另外一方面,我也写了一个全新的guilded drive解压脚本🤔split --filter不仅可以用来将要上传的文件或者数据流分成指定大小的片并扔给subshell处理,也可以将guilded drive列表文件分成指定行数的行扔给subshell🤔这样,我们下载的时候也可以使用这项技术,而在subshell里我们可以实行多线程(迫真)处理,比如给它24行,它就24线程curl这坨玩意并且验证checksum,验证通过就继续,不通过就接着下载,然后循环后面写一个wait来等所有线程vans,再写另外一个循环将临时文件一边cat一边删除🤔考虑到split --filter的特性,这些subshell内部不管并行与否,subshell之间是串行的,所以后面可以直接跟tar解包或者dd,这样,一个不依赖aria2c的guilded解压脚本就搞定了🤔

原理可以说是比我之前写的那个aria2c版好理解多了,而且它还有一个好处,那就是需要的临时空间只有分片大小*线程数那么多,不像aria2c版本需要原文件一倍大小的临时空间(确信🤔

但它的缺点是curl的连接质量远远不如aria2c,反正本地的两台机子测试表明,它没个高质量的网络基本上不是速度太慢就是直接卡住,能卡到5分钟传输不了一个字节(全恼🤔所以恐怕这套玩意只适合用在vps这种网络极好的地方,家宽还是拉寄吧倒⑧🤔

或者其实我完全可以将subshell的下载后端从多线程(大嘘)curl便乘aria2c,然后套用旧多线程脚本里的方法来cat它们🤔当然,此时我肯定得把aria2c等玩意的输出全部重定向到stderr🤔

发表评论