मुझे नहीं लगता कि आप ऐसा कर सकते हैं - मज़बूती से नहीं, और आपके पूछने के तरीके से नहीं। बात यह है, संग्रह का संपीड़न अनुपात संभवतः सिर से पूंछ तक समान रूप से वितरित नहीं किया जाएगा - संपीड़न एल्गोरिदम दूसरों की तुलना में कुछ हिस्सों में बेहतर लागू होगा। बस यह कैसे काम करता है। और इसलिए आप संपीड़ित फ़ाइल के आकार पर अपने विभाजन को कारक नहीं बना सकते।
क्या अधिक है, gzip
बस आकार में 4gbs से अधिक संकुचित फ़ाइलों के मूल आकार को संग्रहीत करने का समर्थन नहीं करता है - यह इसे संभाल नहीं सकता है। और इसलिए आप एक विश्वसनीय आकार प्राप्त करने के लिए संग्रह को क्वेरी नहीं कर सकते - क्योंकि यह आपको बेवकूफ बना देगा।
4 लाइन बात - यह वास्तव में बहुत आसान है। 4-फ़ाइल की बात - मुझे नहीं पता कि आप इसे कैसे मज़बूती से कर सकते हैं और पहले समान आकार प्राप्त करने के लिए संग्रह को निकाले बिना एक समान वितरण के साथ। मुझे नहीं लगता कि आप कोशिश कर सकते हैं क्योंकि मैंने कोशिश की थी।
हालाँकि, आप क्या कर सकते हैं, विभाजित आउटपुट फ़ाइलों के लिए अधिकतम आकार निर्धारित किया गया है, और सुनिश्चित करें कि वे हमेशा रिकॉर्ड अवरोधों पर टूटे हुए हैं। जिसे आप आसानी से कर सकते हैं। यहां एक छोटी स्क्रिप्ट है जो gzip
आर्काइव को हटाकर और कुछ स्पष्ट dd
पाइप-बफ़र्स के माध्यम से सामग्री को विशिष्ट count=$rpt
तर्कों के साथ पाइपिंग करेगी , जो कि lz4
फ़्लाइ पर प्रत्येक फ़ाइल को डिकम्प्रेस / पुनः प्राप्त करने के माध्यम से गुजरने से पहले । मैं भी कुछ छोटे tee
पाइप चाल में फेंक दिया और साथ ही साथ प्रत्येक वर्ग के लिए पिछले चार लाइनों को मुद्रित करने के लिए।
( 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
)
यह सिर्फ तब तक चलता रहेगा जब तक कि यह सभी इनपुट को संभाल न ले। यह इसे कुछ प्रतिशत से विभाजित करने का प्रयास नहीं करता है - जो इसे प्राप्त नहीं कर सकता है - लेकिन इसके बजाय यह विभाजित होकर अधिकतम कच्ची बाइट गिनती प्रति विभाजित करता है। और वैसे भी, आपकी समस्या का एक बड़ा हिस्सा यह है कि आप अपने संग्रह पर एक विश्वसनीय आकार प्राप्त नहीं कर सकते क्योंकि यह बहुत बड़ा है - आप जो भी करते हैं, वह फिर से न करें - विभाजन को 4gbs से कम कर दें, यह गोल हो जाता है , शायद। यह छोटी स्क्रिप्ट, कम से कम, आपको डिस्क के असम्पीडित बाइट को लिखने के लिए बिना ऐसा करने में सक्षम बनाती है।
यहाँ एक छोटा संस्करण आवश्यक के लिए छीन लिया गया है - यह रिपोर्ट के सभी सामानों में नहीं जोड़ता है:
( 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
यह सभी चीजों को पहले की तरह ही करता है, ज्यादातर, इसके बारे में कहने के लिए बस इतना ही नहीं है। इसके अलावा, कम अव्यवस्था है, इसलिए यह देखना आसान है कि क्या चल रहा है, शायद।
IFS=
बात सिर्फ एक को संभालने के लिए है read
यात्रा प्रति पंक्ति। हम read
एक क्योंकि इनपुट समाप्त होने पर हमें अपने लूप की आवश्यकता होती है। यह आपके रिकॉर्ड के आकार पर निर्भर करता है - जो, आपके उदाहरण के अनुसार, 354 बाइट्स प्रति है। मैंने gzip
इसे परीक्षण करने के लिए कुछ यादृच्छिक डेटा के साथ 4 + जीबी आर्क बनाया ।
यादृच्छिक डेटा इस तरह से मिला था:
( 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
... लेकिन शायद आपको इसके बारे में इतना चिंतित होने की आवश्यकता नहीं है, क्योंकि आपके पास पहले से ही डेटा और सभी हैं। समाधान पर वापस जाएं ...
मूल रूप से pigz
- जो करने के लिए की तुलना में थोड़ा तेजी से विघटित लगता है zcat
- असम्पीडित धारा बाहर पाइप, और dd
बफ़र्स कि उत्पादन में लिखने ब्लॉक विशेष रूप से 354-बाइट्स के एक से अधिक आकार। लूप read
एक $line
बार प्रत्येक पुनरावृत्ति का परीक्षण करेगा कि इनपुट अभी भी आ रहा है, जिसे printf
बाद printf
में lz4
दूसरे से पहले dd
ब्लॉक करने के लिए कहा जाता है, विशेष रूप से 354-बाइट्स के एक से अधिक आकार को पढ़ने के लिए कहा जाता है dd
- अवधि के लिए बफरिंग प्रक्रिया के साथ सिंक्रनाइज़ करने के लिए। प्रारंभिक के कारण प्रति पुनरावृत्ति में एक छोटा पाठ होगा read $line
- लेकिन इससे कोई फर्क नहीं पड़ता, क्योंकि हम उस पर lz4
- हमारी कलेक्टर प्रक्रिया - वैसे भी छाप रहे हैं।
मैंने इसे सेट किया है इसलिए प्रत्येक पुनरावृत्ति लगभग 1gb असम्पीडित डेटा को पढ़ेगी और उस इन-स्ट्रीम को 650Mb या इसके आसपास स्ट्रीम करेगी। lz4
बहुत ज्यादा किसी भी अन्य उपयोगी संपीड़न विधि की तुलना में बहुत तेज है - यही कारण है कि मैंने इसे यहां चुना क्योंकि मुझे इंतजार करना पसंद नहीं है। xz
वास्तविक कंप्रेसिंग पर बहुत बेहतर काम करेगा, शायद, हालांकि। lz4
हालाँकि, इसके बारे में एक बात यह है कि यह रैम की गति के करीब अक्सर कम हो सकता है - जिसका अर्थ है कि आप कई बार किसी lz4
संग्रह को इतनी तेज़ी से विघटित कर सकते हैं जितना कि आप इसे वैसे भी मेमोरी में लिख पाएंगे।
बड़ा प्रति पुनरावृत्ति कुछ रिपोर्ट करता है। दोनों लूप dd
ट्रांसफर की गई कच्ची बाइट्स की संख्या और गति वगैरह पर रिपोर्ट छापेंगे। बड़ा लूप भी प्रति चक्र इनपुट की अंतिम 4 पंक्तियों को प्रिंट करेगा, और उसी के लिए एक बाइट काउंट करेगा, उसके बाद ls
डायरेक्टरी जिसमें मैं lz4
अभिलेख लिखता हूं । यहाँ कुछ राउंड ऑफ़ आउटपुट हैं:
/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
?