情况,一个包含 level-2 股票单日数据的7z压缩包,5000多个文件,即使单独访问其中一个,也需要解压整个压缩包,时间占用大。
如果全部解压存盘,则文件过大,一天的数据解压前400M,解压后4G,一个月20个交易日算,80G,一年就需要960G,空间占用大。
zip就没有这个问题,按快速压缩模式,一天的数据压缩后800M,还算可以接受,访问单个文件速度也快,不需要全部解压。
没啥好方法,只能是先解压再打包。
因为压缩包在移动硬盘,体积大、数量多,文件展开过程非常慢,中间解压到本地固态硬盘,然后重新压缩。
以下代码 假设 7z.exe 位于环境变量,可以直接访问。
代码: 全选
use Modern::Perl;
use File::Basename;
STDOUT->autoflush(1);
STDERR->autoflush(1);
for my $e ( glob "*.7z" )
{
printf "%s\n", $e;
my $dir = basename($e, ".7z");
my $zip_file = "${dir}.zip";
system( qq(7z x "${e}" -aos -oD:/Temp -bsp1 ) );
system( qq(7z a "${zip_file}" "D:/Temp/${dir}" -mx1 -mmt4 -bsp1 ) );
if ( -e $zip_file and (-s $zip_file) > 1024*1024*10 )
{
printf "remove folder\n";
system( qq( rd /s /q "D:/Temp/${dir}" ) );
printf "remove 7z file\n";
unlink $e;
}
}