मुझे नहीं लगता कि आप ऐसा कर सकते हैं - मज़बूती से नहीं, और आपके पूछने के तरीके से नहीं। बात यह है, संग्रह का संपीड़न अनुपात संभवतः सिर से पूंछ तक समान रूप से वितरित नहीं किया जाएगा - संपीड़न एल्गोरिदम दूसरों की तुलना में कुछ हिस्सों में बेहतर लागू होगा। बस यह कैसे काम करता है। और इसलिए आप संपीड़ित फ़ाइल के आकार पर अपने विभाजन को कारक नहीं बना सकते।
क्या अधिक है, 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?