다음과 같은 파일이 제공됩니다.
a
b
c
다음과 같은 출력을 얻으려면 어떻게 해야 합니까?
a 0cc175b9c0f1b6a831c399e269772661
b 92eb5ffee6ae2fec3ad71c777531578f
c 4a8a08f09d37b73795649038408b5f33
효율적인 방법으로? (입력은 80GB)
답변1
이것은 Perl에서는 단 한 줄일 수도 있습니다:
head 80gb | perl -MDigest::MD5=md5_hex -nlE'say"$_\t".md5_hex($_)'
a 0cc175b9c0f1b6a831c399e269772661
b 92eb5ffee6ae2fec3ad71c777531578f
c 4a8a08f09d37b73795649038408b5f33
d 8277e0910d750195b448797616e091ad
e e1671797c52e15f763380b45e841ec32
f 8fa14cdd754f91cc6554c9e71929cce7
g b2f5ff47436671b6e533d8dc3614845d
h 2510c39011c5be704182423e3a695e91
i 865c0c0b4ab0e063e5caa3387c1a8741
j 363b122c528f54df4a0446b6bab05515
출력을 저장해야 하고 이 청크를 씹는 동안 멋진 진행률 표시줄을 원하는 경우:
sudo apt install pv #ubuntu/debian
sudo yum install pv #redhat/fedora
pv 80gb | perl -MDigest::MD5=md5_hex -nlE'say"$_\t".md5_hex($_)' | gzip -1 > 80gb-result.gz
답변2
@Ole Tange의 방법 외에도 최적화된 솔루션(Python 부분)이 있습니다.
md5summer.py
스크립트:
#!/usr/bin/python
import sys
import hashlib
for r in sys.stdin:
if r.strip():
h = hashlib.md5()
h.update(r.encode());
print r, '\t', h.hexdigest()
최적화 포인트:
hashlib
- 더 이상 사용되지 않는 라이브러리 대신 실제 라이브러리를 사용하십시오.for r in sys.stdin:
- 목록 대신 생성기와 유사한 객체에서 읽습니다.if r.strip():
hashlib
- 중복된 메서드 호출을 피하기 위해 빈 레코드를 확인하세요.
용법:
parallel --pipepart -a my80gb-file -S server1,server2 --block 1 /path_to/md5summer.py
예제 출력:
a 0cc175b9c0f1b6a831c399e269772661
b 92eb5ffee6ae2fec3ad71c777531578f
c 4a8a08f09d37b73795649038408b5f33
d 8277e0910d750195b448797616e091ad
f 8fa14cdd754f91cc6554c9e71929cce7
e e1671797c52e15f763380b45e841ec32
g b2f5ff47436671b6e533d8dc3614845d
h 2510c39011c5be704182423e3a695e91
i 865c0c0b4ab0e063e5caa3387c1a8741
j 363b122c528f54df4a0446b6bab05515
k 8ce4b16b22b58894aa86c421e8759df3
l 2db95e8e1a9267b7a1188556b2013b33
m 6f8f57715090da2632453988d9a1501b
n 7b8b965ad4bca0e41ab51de7b31363a1
p 83878c91171338902e0fe0fb97a8c47a
o d95679752134a2d9eb61dbd7b91c4bcc
q 7694f4a66316e53c8cdd9d9954bd611d
r 4b43b0aee35624cd95b910189b3dc231
s 03c7c0ace395d80182db07ae2c30f034
t e358efa489f58062f10dd7316b65649e
u 7b774effe4a349c6dd82ad4f4f21d34c
v 9e3669d19b675bd57058fd4664205d2a
w f1290186a5d0b1ceab27f4e77c0c5d68
x 9dd4e461268c8034f5c8564e155c67a6
y 415290769594460e2e485922904f345d
z fbade9e36a3f36d3d676c1b808451dd7
...
답변3
md5er
입력에 따라 올바른 출력을 생성하는 단일 스레드 프로그램( )을 만드는 것부터 시작합니다 .
#!/usr/bin/python
import sys
import hashlib
for r in sys.stdin:
print r[:-1], '\t', hashlib.md5(r[:-1]).hexdigest()
그런 다음 GNU Parallel을 사용하여 입력을 컴퓨팅 서버에 배포할 수 있는 청크로 분할합니다.
parallel --pipepart -a my80gb-file -Sworker1,worker2,worker3,: --block -10 md5er