我有一个1 TB的文件。我想从字节12345678901读取到字节19876543212,并将其放在具有100 MB RAM的计算机上的标准输出上。
我可以轻松地编写一个执行此操作的perl脚本。sysread提供700 MB / s(可以),但是syswrite仅提供30 MB / s。我想要更高效的东西,最好是在每个Unix系统上安装的东西,并且可以以1 GB / s的速度传递。
我的第一个想法是:
dd if=1tb skip=12345678901 bs=1 count=$((19876543212-12345678901))
但这不是有效的。
编辑:
我不知道我怎么测量syswrite错误。这提供了3.5 GB / s的速度:
perl -e 'sysseek(STDIN,shift,0) || die; $left = shift; \
while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ \
$left -= $read; syswrite(STDOUT,$buf);
}' 12345678901 $((19876543212-12345678901)) < bigfile
并避免yes | dd bs=1024k count=10 | wc
噩梦。
bs=1M iflag=skip_bytes,count_bytes