ฉันไม่คิดว่าคุณสามารถทำได้ - ไม่น่าเชื่อถือและไม่ใช่วิธีที่คุณถาม ประเด็นก็คืออัตราส่วนการบีบอัดของอาร์ไคฟ์อาจไม่ได้รับการกระจายอย่างเท่าเทียมกันตั้งแต่หัวจรดท้ายอัลกอริทึมการบีบอัดจะใช้กับบางส่วนได้ดีกว่าส่วนอื่น ๆ นั่นเป็นวิธีการทำงาน ดังนั้นคุณไม่สามารถแยกขนาดไฟล์ที่บีบอัดได้
ยิ่งไปกว่าgzip
นั้นไม่รองรับการจัดเก็บขนาดดั้งเดิมของไฟล์บีบอัดที่มีขนาดใหญ่กว่า 4gbs - มันไม่สามารถจัดการได้ ดังนั้นคุณจึงไม่สามารถสืบค้นที่เก็บถาวรเพื่อให้ได้ขนาดที่เชื่อถือได้เพราะจะหลอกคุณ
สิ่ง 4 บรรทัด - ง่ายมากจริง ๆ สิ่งที่ 4 ไฟล์ - ฉันไม่ทราบว่าคุณสามารถทำได้อย่างน่าเชื่อถือและมีการกระจายอย่างสม่ำเสมอโดยไม่ต้องแยกเก็บถาวรเพื่อให้ได้ขนาดที่ไม่บีบอัด ฉันไม่คิดว่าคุณจะทำได้เพราะฉันพยายาม
อย่างไรก็ตามสิ่งที่คุณสามารถทำได้คือการตั้งค่าขนาดสูงสุดสำหรับไฟล์เอาต์พุตแบบแยกและตรวจสอบให้แน่ใจว่าไฟล์เหล่านั้นเสียที่อุปสรรคการบันทึกเสมอ ที่คุณสามารถทำได้ง่ายๆ นี่เป็นสคริปต์เล็กน้อยที่จะทำโดยการแยกgzip
ไฟล์เก็บถาวรและไพพ์เนื้อหาผ่านdd
ไพพ์บัฟเฟอร์อย่างชัดเจนสองสามตัวที่มีcount=$rpt
อาร์กิวเมนต์เฉพาะก่อนที่จะส่งผ่านlz4
ไปยังเพื่อคลาย / บีบอัดไฟล์แต่ละไฟล์ได้ทันที ฉันยังโยนtee
ลูกเล่นท่อเล็กน้อยเพื่อพิมพ์สี่บรรทัดสุดท้ายสำหรับแต่ละเซ็กเมนต์ไปยัง stderr เช่นกัน
( 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
)
มันจะดำเนินต่อไปจนกว่ามันจะจัดการอินพุตทั้งหมด มันไม่ได้พยายามที่จะแยกมันออกเป็นเปอร์เซ็นต์ - ซึ่งมันไม่สามารถรับได้ - แต่มันจะแยกมันต่อจำนวนไบต์ดิบสูงสุดต่อการแยก ส่วนใหญ่ของปัญหาของคุณคือคุณไม่สามารถรับขนาดที่เชื่อถือได้ในไฟล์เก็บถาวรของคุณเพราะมันใหญ่เกินไป - ไม่ว่าคุณจะทำอะไรอย่าทำอย่างนั้นอีกครั้ง - ทำให้การแยกน้อยกว่า 4 กรัมต่อชิ้น , อาจจะ. อย่างน้อยสคริปต์ตัวนี้จะช่วยให้คุณสามารถทำสิ่งนี้ได้โดยไม่ต้องเขียนไบต์ที่ไม่ได้บีบอัดลงดิสก์
ต่อไปนี้เป็นรุ่นที่สั้นกว่าซึ่งตัดออกจากข้อมูลสำคัญ - มันไม่ได้เพิ่มในเนื้อหารายงานทั้งหมด:
( 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 + gb พร้อมข้อมูลสุ่มเพื่อทดสอบ
ข้อมูลแบบสุ่มได้มาด้วยวิธีนี้:
( 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 ไบต์ ห่วงจะครั้งเดียวซ้ำไปทดสอบว่าการป้อนข้อมูลจะยังคงเดินทางมาถึงซึ่งแต่ละคนจะหลังจากที่ก่อนอื่นจะเรียกว่าการอ่านบล็อกขนาดเฉพาะที่หลายของ 354 ไบต์ - การประสานกับบัฟเฟอร์กระบวนการ - ระยะเวลา จะมีการอ่านสั้น ๆ หนึ่งครั้งต่อการวนซ้ำเนื่องจากการเริ่มต้น- แต่นั่นไม่สำคัญเพราะเรากำลังพิมพ์ที่- กระบวนการการสะสมของเรา - อย่างไรก็ตามread
$line
printf
printf
lz4
dd
dd
read $line
lz4
ฉันได้ตั้งค่าไว้ดังนั้นการทำซ้ำแต่ละครั้งจะอ่านข้อมูลที่ไม่มีการบีบอัดประมาณ 1 กิกะไบต์และบีบอัดข้อมูลนั้นในสตรีมไปที่ประมาณ 650Mb หรือมากกว่านั้น lz4
เร็วกว่าวิธีการบีบอัดที่มีประโยชน์อื่น ๆ - ซึ่งเป็นเหตุผลที่ฉันเลือกที่นี่เพราะฉันไม่ชอบที่จะรอ xz
จะทำได้ดีกว่ามากในการบีบอัดจริงแม้ว่าอาจจะ อย่างไรก็ตามสิ่งหนึ่งที่เกี่ยวกับlz4
มันคือมันสามารถคลายการบีบอัดที่ความเร็วใกล้เคียงกับ RAM - ซึ่งหมายความว่าหลายครั้งที่คุณสามารถคลายการบีบอัด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
ไหร่?