Bunu yapabileceğini sanmıyorum - güvenilir değil ve istediğin gibi değil. Mesele şu ki, arşivin sıkıştırma oranı muhtemelen kafadan kuyruğa eşit olarak dağıtılmayacak - sıkıştırma algoritması bazı parçalara diğerlerinden daha iyi uygulanacaktır. İşte böyle çalışır. Ve böylece bölünmüşlüğünüzü sıkıştırılmış dosyanın boyutuna dahil edemezsiniz.
Dahası gzip
, sıkıştırılmış dosyaların orijinal boyutunun 4 gb'den daha büyük boyutlarda depolanmasını desteklemez - işleyemez. Böylece güvenilir bir boyut elde etmek için arşivi sorgulayamazsınız - çünkü sizi kandırır.
4 satır şey - bu gerçekten çok kolay. 4 dosya şey - sadece sıkıştırılmamış boyutunu almak için arşiv çıkarmadan önce güvenilir ve eşit bir dağıtım ile nasıl yapabileceğini bilmiyorum. Yapabileceğini sanmıyorum çünkü denedim.
Ancak, ne olabilir yapmak, split çıktı dosyaları için maksimum boyutu ayarlamak ve emin olun o zaman rekor bariyerlerindeki kırılır edilir. Kolayca yapabilirsiniz. Burada, gzip
arşivin çıkarılması ve içeriğin her bir dosyayı sıkıştırmak / yeniden sıkıştırmak için iletmeden önce dd
belirli count=$rpt
argümanlarla birkaç açık pipet tamponu aracılığıyla boruları oluşturarak yapacak küçük bir komut dosyası var lz4
. Ayrıca tee
her segmentin son dört satırını stderr'a basmak için birkaç küçük hile attım .
( IFS= n= c=$(((m=(k=1024)*k)/354))
b=bs=354xk bs=bs=64k
pigz -d </tmp/gz | dd i$bs o$b |
while read -r line _$((n+=1))
do printf \\n/tmp/lz4.$n\\n
{ { printf %s\\n "$line"
dd count=$c i$b o$bs
}| tee /dev/fd/3|lz4 -BD -9 >/tmp/lz4.$n
} 3>&1| tail -n4 |tee /dev/fd/2 |
wc -c;ls -lh /tmp/[gl]z*
done
)
Bu, tüm girdileri işleyene kadar devam edecektir. Onu, elde edemediği bir yüzdeye ayırmaya çalışmaz, bunun yerine bölünme başına maksimum ham bayt sayısına böler. Her neyse, probleminizin büyük bir kısmı, arşivinizde güvenilir bir boyut elde edemeyeceğinizdir, çünkü çok büyük - ne yaparsanız yapın, tekrar yapma - bu 4 gb'tan daha az bölünmeleri bu parçaya dönüştürün , olabilir. En azından bu küçük komut dosyası, diske sıkıştırılmamış bir bayt yazmak zorunda kalmadan bunu yapmanızı sağlar.
Aşağıda, temel bilgilerden çıkarılan daha kısa bir sürüm var - tüm rapor öğelerine eklenmiyor:
( IFS= n= c=$((1024*1024/354))
pigz -d | dd ibs=64k obs=354xk |
while read -r line _$((n+=1))
do { printf %s\\n "$line"
dd count=$c obs=64k ibs=354xk
} | lz4 -BD -9 >/tmp/lz4.$n
done
) </tmp/gz
Birincisi ile aynı şeyleri yapar, çoğunlukla bunun hakkında söyleyecek çok şeyi yoktur. Ayrıca, daha az karmaşa var, bu yüzden neler olduğunu görmek daha kolay olabilir.
IFS=
Şey sadece bir idare etmektir read
yinelemesi başına hattı. Biz read
biriz, çünkü girdi bittiğinde döngümüzün bitmesi gerekir. Bu , örnekleminize göre 354 bayt olan kayıt boyutunuza bağlıdır . gzip
Test etmek için bazı rastgele verilerle 4 + gb arşiv oluşturdum .
Rasgele veriler şu şekilde elde edildi:
( mkfifo /tmp/q; q="$(echo '[1+dPd126!<c]sc33lcx'|dc)"
(tr '\0-\33\177-\377' "$q$q"|fold -b144 >/tmp/q)&
tr '\0-\377' '[A*60][C*60][G*60][N*16][T*]' | fold -b144 |
sed 'h;s/^\(.\{50\}\)\(.\{8\}\)/@N\1+\2\n/;P;s/.*/+/;H;x'|
paste "-d\n" - - - /tmp/q| dd bs=4k count=kx2k | gzip
) </dev/urandom >/tmp/gz 2>/dev/null
... ama belki de zaten veriler ve her şeye sahip olduğunuz için bu konuda çok endişelenmenize gerek yok. Çözüme dönelim ...
Temel olarak pigz
- ki bu, sıkıştırılmış olandan biraz daha hızlı zcat
açılır - sıkıştırılmamış akışı dışarı dd
atar ve özellikle 354 baytın katlarında boyutlandırılmış yazma bloklarına çıkan arabellekler. Döngü olacak read
bir $line
o, girdi hala gelen olduğunu test etmek her tekrarında bir defa printf
daha sonra printf
az lz4
bir önceki dd
blok okuma olarak adlandırılır 354-bayt bir katına, özellikle boyutlu - tamponlama ile senkronize etmek için dd
sürecin - süresince. İlkinden dolayı yineleme başına bir kısa okuma olacak read $line
- ama bu önemli değil, çünkü yine de lz4
- toplayıcı sürecimizde - yazdırıyoruz .
Her yinelemede yaklaşık 1 g sıkıştırılmamış veri okuyacak ve yayın içi 650Mb'ye kadar sıkıştıracak şekilde ayarladım. lz4
diğer kullanışlı sıkıştırma yöntemlerinden çok daha hızlı - bu yüzden burada seçtim, çünkü beklemek istemiyorum. xz
olsa da, gerçek sıkıştırmada çok daha iyi bir iş çıkarırdı. Bir şey hakkında lz4
bir çok kez anlamı bir sıkıştırmasını - olsa da, genellikle serbest kalır RAM hızları için kapanışında yapabilirsiniz olduğunu lz4
zaten belleğe yazma mümkün olacaktır tıpkı hızlı arşivi.
Büyük olan, yineleme başına birkaç rapor yapar. Her iki döngü de dd
aktarılan ham bayt sayısı ve hızı vb. Büyük döngü ayrıca, döngü başına son 4 satır girişini ve bunun için bir bayt sayısını ve ardından arşivleri ls
yazdığım dizinin bir tanesini yazdıracaktır lz4
. İşte birkaç çıkış turu:
/tmp/lz4.1
2961+1 records in
16383+1 records out
1073713090 bytes (1.1 GB) copied, 169.838 s, 6.3 MB/s
@NTACGTANTTCATTGGNATGACGCGCGTTTATGNGAGGGCGTCCGGAANGC+TCTCTNCC
TACGTANTTCATTGGNATGACGCGCGTTTATGNGAGGGCGTCCGGAANGCTCTCTNCCGAGCTCAGTATGTTNNAAGTCCTGANGNGTNGCGCCTACCCGACCACAACCTCTACTCGGTTCCGCATGCATGCAACACATCGTCA
+
I`AgZgW*,`Gw=KKOU:W5dE1m=-"9W@[AG8;<P7P6,qxE!7P4##,Q@c7<nLmK_u+IL4Kz.Rl*+w^A5xHK?m_JBBhqaLK_,o;p,;QeEjb|">Spg`MO6M'wod?z9m.yLgj4kvR~+0:.X#(Bf
354
-rw-r--r-- 1 mikeserv mikeserv 4.7G Jun 16 08:58 /tmp/gz
-rw-r--r-- 1 mikeserv mikeserv 652M Jun 16 12:32 /tmp/lz4.1
/tmp/lz4.2
2961+1 records in
16383+1 records out
1073713090 bytes (1.1 GB) copied, 169.38 s, 6.3 MB/s
@NTTGTTGCCCTAACCANTCCTTGGGAACGCAATGGTGTGANCTGCCGGGAC+CTTTTGCT
TTGTTGCCCTAACCANTCCTTGGGAACGCAATGGTGTGANCTGCCGGGACCTTTTGCTGCCCTGGTACTTTTGTCTGACTGGGGGTGCCACTTGCAGNAGTAAAAGCNAGCTGGTTCAACNAATAAGGACNANTTNCACTGAAC
+
>G-{N~Q5Z5QwV??I^~?rT+S0$7Pw2y9MV^BBTBK%HK87(fz)HU/0^%JGk<<1--7+r3e%X6{c#w@aA6Q^DrdVI0^8+m92vc>RKgnUnMDcU:j!x6u^g<Go?p(HKG@$4"T8BWZ<z.Xi
354
-rw-r--r-- 1 mikeserv mikeserv 4.7G Jun 16 08:58 /tmp/gz
-rw-r--r-- 1 mikeserv mikeserv 652M Jun 16 12:32 /tmp/lz4.1
-rw-r--r-- 1 mikeserv mikeserv 652M Jun 16 12:35 /tmp/lz4.2
zcat file > /dev/null
sürer?