Tôi không nghĩ bạn có thể làm điều này - không đáng tin cậy, và không phải theo cách bạn yêu cầu. Vấn đề là, tỷ lệ nén của kho lưu trữ có thể sẽ không được phân bổ đều từ đầu đến đuôi - thuật toán nén sẽ áp dụng tốt hơn cho một số phần so với các phần khác. Đó chỉ là cách nó hoạt động. Và do đó, bạn không thể phân chia sự phân chia của mình theo kích thước của tệp nén.
Hơn nữa, gzip
không hỗ trợ lưu trữ kích thước gốc của các tệp nén có kích thước lớn hơn 4gbs - nó không thể xử lý được. Và vì vậy, bạn không thể truy vấn kho lưu trữ để có được kích thước đáng tin cậy - bởi vì nó sẽ đánh lừa bạn.
Điều 4 dòng - thực sự khá dễ dàng. Điều gồm 4 tệp - Tôi chỉ không biết làm thế nào bạn có thể làm điều đó một cách đáng tin cậy và với một bản phân phối đồng đều mà không cần trích xuất kho lưu trữ để có được kích thước không nén của nó. Tôi không nghĩ bạn có thể bởi vì tôi đã cố gắng.
Tuy nhiên, những gì bạn có thể làm là đặt kích thước tối đa cho các tệp đầu ra được phân chia và đảm bảo rằng các tệp đó luôn bị phá vỡ ở các rào cản kỷ lục. Điều đó bạn có thể dễ dàng làm. Đây là một đoạn script nhỏ sẽ thực hiện điều đó bằng cách trích xuất gzip
kho lưu trữ và dẫn nội dung qua một vài dd
bộ đệm ống rõ ràng với các count=$rpt
đối số cụ thể , trước khi chuyển qua đó lz4
để giải nén / giải nén từng tệp một cách nhanh chóng. Tôi cũng đã ném vào một vài tee
thủ thuật đường ống nhỏ để in bốn dòng cuối cùng cho mỗi phân đoạn để stderr là tốt.
( 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
)
Điều đó sẽ chỉ tiếp tục cho đến khi nó đã xử lý tất cả các đầu vào. Nó không cố gắng phân tách nó theo một tỷ lệ phần trăm - mà nó không thể có được - nhưng thay vào đó, nó chia nó theo số byte thô tối đa trên mỗi lần phân chia. Và dù sao, một vấn đề lớn của bạn là bạn không thể có được kích thước đáng tin cậy trong kho lưu trữ của mình vì nó quá lớn - dù bạn có làm gì đi nữa, đừng làm điều đó một lần nữa - hãy chia nhỏ hơn 4gbs một vòng , có lẽ. Kịch bản nhỏ này, ít nhất, cho phép bạn làm điều này mà không cần phải ghi một byte không nén vào đĩa.
Đây là một phiên bản ngắn hơn được loại bỏ các yếu tố cần thiết - nó không thêm vào tất cả các nội dung báo cáo:
( 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
Nó thực hiện tất cả những điều tương tự như lần đầu tiên, chủ yếu, nó chỉ không có nhiều điều để nói về nó. Ngoài ra, có thể ít lộn xộn hơn để có thể dễ dàng nhìn thấy những gì đang xảy ra, có thể.
Các IFS=
điều là chỉ để xử lý một read
dòng cho mỗi lần lặp. Chúng tôi read
một vì chúng tôi cần vòng lặp của chúng tôi kết thúc khi đầu vào kết thúc. Điều này phụ thuộc vào kích thước bản ghi của bạn - mà, theo ví dụ của bạn, là 354 byte mỗi. Tôi đã tạo một gzip
kho lưu trữ 4 + gb với một số dữ liệu ngẫu nhiên để kiểm tra nó.
Dữ liệu ngẫu nhiên có được theo cách này:
( 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
... nhưng có lẽ bạn không cần phải lo lắng nhiều về điều đó, vì bạn đã có sẵn dữ liệu. Quay lại giải pháp ...
Về cơ bản pigz
- dường như giải nén nhanh hơn một chút zcat
- loại bỏ luồng không nén và dd
bộ đệm tạo ra các khối ghi có kích thước cụ thể ở bội số 354 byte. Các vòng lặp sẽ read
một $line
lần mỗi lần lặp để kiểm tra rằng đầu vào vẫn đến, mà nó sẽ printf
sau đó printf
tại lz4
trước khác dd
được gọi là để đọc các khối có kích thước đặc biệt tại một bội số của 354-byte - để đồng bộ hóa với đệm dd
quá trình - trong suốt thời gian. Sẽ có một lần đọc ngắn cho mỗi lần lặp vì lần đầu tiên read $line
- nhưng điều đó không thành vấn đề, bởi vì chúng tôi đang in nó tại lz4
- quy trình thu thập của chúng tôi - dù sao đi nữa.
Tôi đã thiết lập nó để mỗi lần lặp sẽ đọc khoảng 1gb dữ liệu không nén và nén luồng đó vào khoảng 650Mb hoặc hơn. lz4
nhanh hơn nhiều so với bất kỳ phương pháp nén hữu ích nào khác - đó là lý do tôi chọn nó ở đây vì tôi không muốn chờ đợi. xz
Mặc dù vậy, sẽ làm một công việc tốt hơn nhiều ở việc nén thực tế. lz4
Mặc dù vậy, một điều về nó là nó thường có thể giải nén ở gần tốc độ RAM - điều đó có nghĩa là rất nhiều lần bạn có thể giải nén một lz4
kho lưu trữ nhanh như bạn có thể ghi nó vào bộ nhớ.
Cái lớn làm một vài báo cáo mỗi lần lặp. Cả hai vòng lặp sẽ in dd
báo cáo về số lượng byte thô được truyền và tốc độ, v.v. Vòng lặp lớn cũng sẽ in 4 dòng đầu vào cuối cùng cho mỗi chu kỳ và số byte tương tự, theo sau là một ls
thư mục mà tôi viết lz4
tài liệu lưu trữ. Dưới đây là một vài vòng đầu ra:
/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
?