আমি মনে করি না আপনি এটি করতে পারবেন - নির্ভরযোগ্যভাবে নয়, এবং আপনি যেভাবে জিজ্ঞাসা করছেন তা নয়। জিনিসটি হচ্ছে, সংরক্ষণাগারটির সংকোচনের অনুপাত সম্ভবত মাথা থেকে লেজ পর্যন্ত সমানভাবে বিতরণ করা হবে না - সংক্ষেপণ অ্যালগরিদম অন্যদের তুলনায় কিছু অংশে আরও ভাল প্রয়োগ হবে। এটি ঠিক কিভাবে এটি কাজ করে। এবং তাই আপনি সংকুচিত ফাইলের আকারের উপর আপনার বিভক্তিকে ফ্যাক্টর করতে পারবেন না।
আরও কী, gzip4gbs আকারের চেয়ে বড় সংকোচিত ফাইলের মূল আকারটি সংরক্ষণ করা সমর্থন করে না - এটি এটি পরিচালনা করতে পারে না। এবং সুতরাং আপনি একটি নির্ভরযোগ্য আকার পেতে সংরক্ষণাগারটি জিজ্ঞাসা করতে পারবেন না - কারণ এটি আপনাকে বোকা বানাবে।
4 লাইনের জিনিস - এটি সত্যিই খুব সহজ। 4-ফাইলের জিনিস - আমি কেবল জানি না আপনি কীভাবে এটি নির্ভরযোগ্যভাবে করতে পারেন এবং প্রথমদিকে সংরক্ষণাগারটি সঙ্কুচিত আকার ছাড়াই সংগ্রহ না করে আপনি এমনকি এমনকি বিতরণও করতে পারেন with আমি চেষ্টা করি না বলে আপনি করতে পারেন বলে আমি মনে করি না।
যাইহোক, আপনি যা করতে পারেন তা বিভক্ত আউটপুট ফাইলগুলির জন্য সর্বাধিক আকার নির্ধারণ করা হয়েছে এবং নিশ্চিত করুন যে সেগুলি সর্বদা রেকর্ড বাধাগুলিতে নষ্ট হয়। যা আপনি সহজেই করতে পারেন। এখানে একটি ছোট স্ক্রিপ্ট যা 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নিতে পারে?