많은 수의 작은 파일을 압축 및 전송할 때 메모리 문제 (총 1TB)


15

약 1TB의 저장 공간을 차지하는 5 백만 개의 파일이 있습니다. 이 파일을 타사로 전송해야합니다.

가장 좋은 방법은 무엇입니까? .tar.gz를 사용하여 크기를 줄이려고했지만 컴퓨터에 8GB RAM이 있어도 "시스템 메모리 부족"오류가 발생합니다.

파일을 달팽이 메일로 보내는 가장 좋은 솔루션입니까?


9
.tar.gz압축 파일 생성 또는 복사에 문제가 있습니까? 어느 쪽이든, 파일이 크기 때문에 어떤 조작도 더 많은 메모리를 소비하지 않기 때문에 무언가 이상합니다. 즉, 두 작업 모두 스트리밍되어야합니다. 정확히 어떤 명령이 실패했는지에 대한 자세한 정보를 포함하십시오.
Celada

1
귀하와 제 3자가 어느 정도의 대역폭을 절약 할 수 있습니까? 순진한 rsync는 우송료를 절약 할 수 있습니다. 그러나 rsync가 메모리에 파일 목록을 작성하려고 시도하고 list (5e6 파일)> 8GB 인 경우 "5 백만"파일이 어떻게 작동하는지 모르겠습니다. 물론 속도가 느릴 것입니다.
Kalvin Lee

2
@oshirowanen 파일 목록을 계산하는 데 메모리를 많이 소비 해야 한다고 생각하지 않습니다 . 파일 tar을 나열 할 때 점진적으로 아카이브해야하며 메모리에 목록을 작성하지 않아야하기 때문입니다. 그러나 다시, 사용중인 정확한 명령을 보여주십시오. 또한 모든 파일이 동일한 디렉토리에 있습니까? 아니면 디렉토리 구조가 매우 깊습니까?
Celada

3
예, 물론 GUI 프로그램은 확장 성 및 견고성과 같은 목표를 중요하게 고려하지 않고 구축됩니다. 그것이 GUI 래퍼 / 프론트 엔드의 결함이라면 놀라지 않을 것입니다. 명령 행을 사용하여 파일을 작성하면 제대로 작동한다고 생각합니다.
Celada

3
1TB의 데이터는 100Mbit / s 광대역 연결로 전송하는 데 최소 22 시간이 걸립니다. 따라서 압축 정도에 따라 달팽이 메일이 실제로 더 빠른 옵션 일 수 있습니다.
Dan

답변:


27

의견에 제공된 추가 정보는 OP가 GUI 방법을 사용하여 .tar.gz파일 을 작성하고 있음을 나타 냅니다.

GUI 소프트웨어는 종종 해당 명령 줄에 해당하는 소프트웨어보다 훨씬 더 많은 부풀림을 포함하거나 진행률 표시 줄과 같은 "추가"기능을 위해 불필요한 작업을 추가로 수행합니다. GUI 소프트웨어가 메모리의 모든 파일 이름 목록을 수집하려고해도 놀랄 일이 아닙니다. 아카이브를 작성하기 위해이를 수행 할 필요는 없습니다. 전용 도구 tar와는 gzipdefintely가 입력 및 메모리보다 훨씬 더 큰 출력을 처리 할 수 있음을 의미 입력과 출력을 스트리밍으로 작동하도록 설계되었습니다.

GUI 프로그램을 피하면 다음 tar과 같이 완전히 정상적인 일상 호출을 사용하여이 아카이브를 생성 할 수 있습니다 .

tar czf foo.tar.gz foo

foo5 백만 개의 파일이 모두 들어있는 디렉토리는 어디에 있습니까 ?

이 질문에 대한 다른 답변 tar은 결과를 여러 조각으로 나누려는 경우 시도 할 수있는 몇 가지 추가 대체 명령을 제공합니다 .


15

"5 백만"파일과 총 1TB? 그러면 파일이 매우 작아야합니다. 나는 단순히 시도 할 것이다 rsync:

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir

당신이 그것을 가지고 있지 않거나 유스 케이스가을 사용할 수 rsync없다면 적어도 7z데이터와 함께 작동하는지 확인해야 합니다. 아닐 수도 있지만 시도해 볼 가치가 있다고 생각합니다.

7z a archive.7z /source/dir

또는 7z적어도 편한 느낌이 들지 않으면 .tar.xz아카이브를 만들어보십시오 .

tar cJv archive.tar.xz /source/dir

(이전 버전의 버전은 스위치를 사용할 때 아카이브를 tar생성하지 않지만 .tar.xz아카이브를 생성 한다는 점에 유의해야합니다 . 이전 버전의조차도 플래그를 모두 지원하지는 않습니다 .).tar.lzmaJtarJ


GUI 프로그램을 사용하여 해당 파일을 작성하고 있으므로 명령 행 인터페이스를 사용하는 것이 약간 불편하다고 가정합니다.

명령 행 인터페이스에서 아카이브를 쉽게 작성, 관리 및 추출 할 수 있도록라는 작은 유틸리티가 atool있습니다. 그것은 필자가 실제로 보았던 모든 일반적인 배포판에서 사용할 수 있으며, 절망적으로 모호하지 않은 한, 내가 찾은 거의 모든 단일 아카이브에서 작동합니다.

atool작업장 환경에있을 때 배포판에 저장소가 있는지 확인 하거나 관리자에게 설치하도록 요청하십시오.

atool 많은 심볼릭 링크를 자체적으로 설치하므로 패킹 및 언 패킹이 산들 바람이됩니다.

apack archive.tar.xz <files and/or directories>

아카이브를 만듭니다.

aunpack archive.7z

아카이브를 확장합니다.

als archive.rar

파일 내용을 나열합니다.

어떤 종류의 아카이브가 작성 atool되는지는 명령 행에서 아카이브의 파일 이름 확장자로 식별합니다.


4
여기서 사용하는 이점 rsync은 연결이 끊어진 경우 연결이 끊긴 rsync곳을 찾을 수 있다는 것입니다.
roaima 2016 년

2
파일은 평균 200KB입니다. 그다지 작은 것은 아닙니다.
Nate Eldredge 2016 년

4
@NateEldredge 나는 보통 1GB를 초과하는 의미로 생각합니다. 작음은 보통 <1MB입니다. 아주 작습니다.
PythonNut

8

25 : 1 압축보다 더 잘 수행 할 수 없으면 타사 메일을 교환 할 수있는 하드웨어 테이프 형식이없는 한 달팽이 메일 링 전에 압축을 통해 얻을 수있는 가능성이 거의 없습니다.

가장 큰 공통 저장소는 파란 광선이며 대략 40Gb를 얻습니다. 데이터에 맞추려면 데이터를 25 대 1 압축해야합니다. 타사에 DVD 만있는 경우 125 : 1 (대략)이 필요합니다.

압축 번호를 일치시킬 수없는 경우 일반 디스크를 사용하고 타사 메일을 복사하여 달팽이 메일로 보내십시오. 이 경우 압축이 필요한 1Tb 드라이브보다 작은 것을 운송하는 것은 광기입니다.

네트워크를 통해 파일을 복사하기 위해 ssh -C압축 (표준 압축) 또는 압축 을 사용하는 것과 비교하는 것만 rsync으로 압축하고 압축 할 필요가 없습니다. 1Tb는 인터넷을 통해 이동하는 것이 불가능하지는 않지만 시간이 걸릴 것입니다.


5
+1 : "고속도로를 손상시키는 테이프로 가득 찬 스테이션 왜건의 대역폭을 과소 평가하지 마십시오"(Andrew S. Tanenbaum). en.wikipedia.org/wiki/Sneakernet
Olivier Dulac를

@OlivierDulac Boeing 747과 CDROM으로 가득 찬 상자로 비슷한 구성을 보았으므로 어떤 종류의 처리량을 얻을 수 있는지 놀랍습니다.
Anthon

I는 피진이 멀다하여 ISP를 이길 것을 좋아 ^^ 위키 피 디아 페이지의 exemples를 참조
올리비에 Dulac

6

급류를 고려 했습니까? 인터넷을 통한 전송에는 Peer-to-Peer가 가장 좋습니다.

  • 다른 인터넷 전송 속도 이상 : 업로드 속도에 따라 전송 속도가 결정됩니다
  • 데이터 손상 없음
  • 먼저 전송할 파일을 선택하십시오
  • 추가 로컬 / 클라우드 스토리지 공간이 필요하지 않습니다
  • 비어 있는

어떤 OS를 사용하고 있는지 말하지 않았지만 tar.gz 압축에 대해 말하면서 GNU / Linux와 같은 OS를 사용한다고 가정합니다. 이를 위해 Transmission을 제안 합니다. Mac 및 Linux에서 실행되는 오픈 소스 토런트 소프트웨어입니다. 개발자가 플랫폼 간 언어가 아닌 지원하는 모든 GUI 클라이언트에 고유하게 만들려고 노력했기 때문에 마음에 들었습니다.

이 방법을 압축과 결합 할 수 있지만 전송의 우선 순위를 정하는 기능은 손실됩니다.


토렌트 소프트웨어는 아마도 GUI 소프트웨어를 압축하는 것과 같은 문제를 가지고 있습니다. 파일 이름을 메모리 등에 저장. 토렌트 파일은 파일의 메타 데이터를 저장해야합니다. 5 백만 개의 파일 이름이 토렌트 파일로 압축되어야합니다.
Ayesh K

@AyeshK True, 이것은 토런트를 추가 / 생성하거나 체크섬을 확인할 때 성능에 영향을 미칩니다. 여전히 이것이 대량의 데이터 전송을위한 가장 안정적인 솔루션이라고 생각합니다.
LaX

토렌트 괴물에 따르면, 가장 큰 토렌트는 ~ 800gb입니다. 대부분의 파일이 약 33K 파일 포함 된 단일 토런트 파일. 하지만 5 백만 개의 파일 ... 확실하지 않습니다.
Ayesh K

3

7z는 나의 선택 일 것입니다. 아카이브를 자동 분할하고 멀티 스레드 압축을 지원합니다. 아니, xz도움말 메시지의 말씀에도 불구하고,하지 않습니다. 시도해보십시오 :

7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/

출력은 100MB 블록으로 분할됩니다 ( -v스위치로 변경 ).

유일한 단점은 7z가 유닉스 메타 데이터 (예 : 권한 및 소유자)를 유지하지 않는다는 것입니다. 필요한 경우 tar출력을 파이프 로 연결 7za하십시오 ( man 7za일부 예제 참조 ).


1
The only real downside그러나 얼마나 단점!
njzk2

@ njzk2 실제로 시나리오에 따라 다릅니다. 예를 들어, 백업 이미지 또는 데이터베이스 덤프를 보내는 경우 권한에 대해서는별로 신경 쓰지 않을 것입니다.
Stefano Sanfilippo

split.tar.gz 파일에서 사용할 수 있고 메타 데이터를 유지할 수있을 때 분할에 7z를 사용하는 요점을 잘 알지 못합니다 .
njzk2

@ njzk2 분할됩니다. 기본적으로 LZMA2를 사용한 다중 스레드 압축이 있습니다. 내가 알고있는 다른 유닉스 유틸리티는 그것을 지원하지 않습니다. 7z는 또한 비 압축 압축 모드를 가지고 있는데, 이는 특정 파일에만 tar접근 해야 접근 할 때 큰 발전 입니다.
Stefano Sanfilippo 2016 년


3

폴더를 마우스 오른쪽 버튼으로 클릭하고 "아카이브 생성"을 클릭하고 .tar.gz 옵션을 선택했습니다. 디렉토리 구조는 500,000 개가 넘는 디렉토리입니다.

그래, 행운을 빕니다. 그리고 GUI 도구는 동일한 볼륨에서이 작업을 수행하려고합니다. 이는 a) 다른 1Tb 여유 공간이 필요하고 b) 하나의 파일을 읽고 아카이브에 추가하는 헤드 스레 싱이 드라이브에 적합하지 않음을 의미합니다.

두 가지 가능성이 있습니다.

1) 컴퓨터에서 타사로 rsync. 하나 또는 다른 하나는 자주 변경되지 않는 글로벌 IP 주소가 필요합니다. rsync의 가장 장점은 어떤 이유로 든 중단되면 중단 된 부분을 가져올 수 있다는 것입니다. 1Tb 타르볼 복사가 성공 또는 실패

2) 1Tb 외장 드라이브를 구입하여 복사 한 후 드라이브를 배달하십시오. 대기 시간이 길지만 도착할 때 실제로 좋은 대역폭입니다. 초기 백업을위한 다양한 온라인 백업 서비스



1

다음과 같은 것을 사용하는 것이 좋습니다.

tar -c -L 104857600 -f file1.tar -f file2.tar -f file3.tar -f file4.tar -f file5.tar -f file6.tar -f file7.tar -f file8.tar -f file9.tar -f file10.tar 
gzip file*.tar

최대 100GB의 10 개의 파일이 생성됩니다. 그러나 tar가 읽기 / 쓰기로 스트리밍해야하기 때문에 "OOM"문제에 대한 답을 얻지 못하므로 병목 현상은 명백히 gzip입니다.


0

어떻게에 대한:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find 검색은 디렉토리 트리를 나열합니다
  • tar -T - stdin에서 목록을 읽습니다.
  • -czf -아카이브를 만들고 stdout에 쓰고 z스트림 을 압축 합니다.
  • ssh remotehost 다음을 사용하여 remotehost에 로그인하십시오 ssh
  • cd /target/dir/ 대상 디렉토리로 변경
  • tar xzf - stdin에서 들어오는 스트림을 추출

좋은 작은 발췌 문장. 비록 여기에 그의 요구가 압축 기능이라고 생각하지만, 그 목적은 "친구에게 전송"하는 것이기 때문에
mveroone

네트워크 중단 (24 시간마다 ISP를 연결 해제하는 ISP가 있음) 또는 기타 이유로 인해 연결이 중단 될 때 아카이브를 완전히 작성하지 않으면 1TB를 전송하는 동안 전혀 발생하지 않을 수 있습니다.
Jonas Schäfer

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.