ปัญหาหน่วยความจำเมื่อบีบอัดและถ่ายโอนไฟล์ขนาดเล็กจำนวนมาก (รวม 1TB)


15

ฉันมี 5 ล้านไฟล์ซึ่งใช้พื้นที่จัดเก็บประมาณ 1TB ฉันต้องการถ่ายโอนไฟล์เหล่านี้ไปยังบุคคลที่สาม

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร? ฉันได้ลองลดขนาดโดยใช้. tar.gz แต่ถึงแม้ว่าคอมพิวเตอร์ของฉันมี 8GB RAM ฉันได้รับข้อผิดพลาด "ออกจากระบบหน่วยความจำ"

วิธีที่ดีที่สุดในการหอยทากไฟล์ทางไปรษณีย์คืออะไร?


9
คุณมีปัญหาในการสร้าง.tar.gzหรือคัดลอกไฟล์บีบอัดที่ได้หรือไม่ ทั้งสองวิธีมีบางอย่างแปลก ๆ เพราะการดำเนินการไม่ควรใช้หน่วยความจำมากขึ้นเพียงเพราะไฟล์มีขนาดใหญ่ นั่นคือการดำเนินการทั้งสองควรจะสตรีม โปรดรวมข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งที่ล้มเหลวอย่างแน่นอน
Celada

1
คุณมีแบนด์วิธเท่าไหร่และบุคคลที่สามที่เหลือ? rsync ไร้เดียงสาอาจช่วยคุณประหยัดค่าไปรษณีย์ แต่ฉันไม่ทราบว่าไฟล์ "ห้าล้าน" จะทำงานให้คุณได้อย่างไรเพราะ rsync จะพยายามสร้าง filelist ในหน่วยความจำและสามารถทำได้ถ้า list (5e6 ไฟล์)> 8 GB และแน่นอนมันจะช้า
Kalvin Lee

2
@oshirowanen ฉันไม่คิดว่ามันน่าจะใช้หน่วยความจำในการคำนวณรายชื่อไฟล์เพราะฉันค่อนข้างมั่นใจว่าtarควรจะเก็บไฟล์ไว้เพิ่มขึ้นเรื่อย ๆ เนื่องจากมันแสดงรายชื่อไม่เคยสร้างรายการในหน่วยความจำ แต่อีกครั้งโปรดแสดงคำสั่งที่แน่นอนที่คุณใช้ นอกจากนี้ไฟล์ทั้งหมดในไดเรกทอรีเดียวกันหรือเป็นโครงสร้างไดเรกทอรีที่ลึกมาก?
Celada

3
อ่าใช่โปรแกรม GUI ที่ดีมักถูกสร้างขึ้นโดยไม่ให้ความสำคัญกับเป้าหมายเช่นความสามารถในการปรับขนาด มันจะไม่แปลกใจถ้ามันเป็นความผิดของ GUI wrapper / frontend สร้างไฟล์โดยใช้บรรทัดคำสั่งและฉันคิดว่าคุณจะพบว่ามันใช้งานได้ดี
Celada

3
ข้อมูล 1 TB จะใช้เวลาอย่างน้อย 22 ชั่วโมงในการถ่ายโอนด้วยการเชื่อมต่อบรอดแบนด์ 100 Mbit / s ดังนั้นขึ้นอยู่กับว่าคุณต้องการบีบอัดให้ได้เท่าใดจดหมายหอยทากอาจเป็นตัวเลือกที่เร็วกว่า
Dan

คำตอบ:


27

ข้อมูลเพิ่มเติมที่ให้ไว้ในความคิดเห็นพบว่า OP กำลังใช้วิธี GUI เพื่อสร้าง.tar.gzไฟล์

ซอฟต์แวร์ GUI มักจะมีส่วนขยายมากกว่าซอฟต์แวร์บรรทัดคำสั่งเทียบเท่าหรือทำงานที่ไม่จำเป็นเพิ่มเติมเพื่อประโยชน์ของคุณสมบัติ "พิเศษ" บางอย่างเช่นแถบความคืบหน้า ไม่แปลกใจเลยถ้าซอฟต์แวร์ GUI พยายามรวบรวมรายชื่อไฟล์ทั้งหมดในหน่วยความจำ ไม่จำเป็นต้องทำเช่นนั้นเพื่อสร้างไฟล์เก็บถาวร เครื่องมือเฉพาะtarและgzipได้รับการออกแบบอย่างพิถีพิถันเพื่อทำงานกับการสตรีมอินพุตและเอาต์พุตซึ่งหมายความว่าพวกเขาสามารถจัดการกับอินพุทและเอาท์พุทที่ใหญ่กว่าหน่วยความจำได้มาก

หากคุณหลีกเลี่ยงโปรแกรม GUI คุณสามารถสร้างที่เก็บถาวรนี้ได้โดยใช้การtarเรียกใช้ทุกวันตามปกติดังนี้:

tar czf foo.tar.gz foo

โดยที่fooเป็นไดเรกทอรีที่มีไฟล์ทั้งหมด 5 ล้านไฟล์ของคุณ

คำตอบอื่น ๆ สำหรับคำถามนี้ให้tarคำสั่งทางเลือกเพิ่มเติมสองสามข้อเพื่อลองใช้ในกรณีที่คุณต้องการแยกผลลัพธ์ออกเป็นหลาย ๆ ส่วน ฯลฯ


15

ไฟล์ "ห้าล้าน" และทั้งหมด 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.lzmaเก็บถาวรเมื่อใช้Jสวิตช์แม้รุ่นเก่ายังtarไม่สนับสนุนการJตั้งค่าสถานะทั้งหมด)


เนื่องจากคุณใช้โปรแกรม GUI เพื่อสร้างไฟล์เหล่านั้นฉันถือว่าคุณรู้สึกอึดอัดเล็กน้อยเมื่อใช้อินเตอร์เฟสบรรทัดคำสั่ง

เพื่ออำนวยความสะดวกการสร้างการจัดการและการสกัดของคลังจากอินเตอร์เฟซบรรทัดคำสั่งมียูทิลิตี้เล็ก ๆ atoolเรียกว่า มันใช้งานได้จริงสำหรับทุก distro ที่ฉันเคยเห็นและใช้งานได้ดีมากกับทุก ๆ ไฟล์ที่ฉันพบ

ตรวจสอบว่า distro ของคุณatoolอยู่ใน repos หรือขอให้ผู้ดูแลระบบของคุณติดตั้งเมื่ออยู่ในสภาพแวดล้อมการทำงาน

atool ติดตั้งพวง symlink กับตัวเองดังนั้นการบรรจุและแกะออกจะกลายเป็นเรื่องง่าย:

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

สร้างที่เก็บถาวร

aunpack archive.7z

ขยายไฟล์เก็บถาวร

als archive.rar

แสดงรายการเนื้อหาไฟล์

ชนิดของไฟล์เก็บถาวรที่สร้างขึ้นatoolแยกแยะว่าโดยส่วนขยายชื่อไฟล์ของไฟล์เก็บถาวรของคุณในบรรทัดคำสั่ง


4
ข้อดีของการใช้ที่นี่rsyncคือถ้า (เมื่อ) การเชื่อมต่อหยุดลงrsyncสามารถเลือกจุดที่มันค้างไว้ได้
roaima

2
ไฟล์จะเป็นค่าเฉลี่ย 200 KB นั่นไม่ใช่ทั้งหมดที่เล็ก
Nate Eldredge

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 ฉันได้เห็นโครงสร้างที่คล้ายกันกับโบอิ้ง 747 และกล่องที่เต็มไปด้วย CDROM มันน่าทึ่งว่าคุณสามารถรับปริมาณงานได้มาก
Anthon

ฉันชอบที่ pidgin เอาชนะ ISP ด้วยการยิงไกลดูตัวอย่างหน้าวิกิพีเดีย ^^
Olivier Dulac

6

คุณพิจารณาเรื่องฝนตกหนักหรือไม่ Peer-to-Peer อาจเป็นตัวเลือกที่ดีที่สุดของคุณสำหรับการถ่ายโอนผ่านอินเทอร์เน็ต:

  • อย่างน้อยเร็วเท่ากับการถ่ายโอนทางอินเทอร์เน็ตอื่น ๆ : ความเร็วในการอัพโหลดของคุณจะเป็นตัวกำหนดความเร็วในการถ่ายโอน
  • ไม่มีข้อมูลเสียหาย
  • เลือกไฟล์ที่จะถ่ายโอนก่อน
  • ไม่จำเป็นต้องมีพื้นที่เก็บข้อมูลในพื้นที่ / ระบบคลาวด์เพิ่มเติม
  • ฟรี

คุณไม่ได้บอกระบบปฏิบัติการที่คุณใช้อยู่ แต่เมื่อคุณพูดถึงการบีบอัด tar.gz ฉันจะสมมติว่าคุณใช้ระบบปฏิบัติการ GNU / Linux ที่มีลักษณะคล้ายกัน เพื่อที่ฉันจะแนะนำเกียร์ มันเป็นซอฟต์แวร์ฝนตกหนักโอเพ่นซอร์สที่ทำงานบน Mac และ Linux ฉันชอบเพราะนักพัฒนาใช้ความพยายามในการทำให้มันเป็นภาษาของลูกค้า GUI ที่พวกเขาสนับสนุน: ไม่มีภาษาข้ามแพลตฟอร์ม

คุณสามารถรวมวิธีนี้กับการบีบอัดได้ แต่คุณจะสูญเสียความสามารถในการจัดลำดับความสำคัญของการถ่ายโอน


ซอฟต์แวร์ Torrent อาจมีปัญหาเดียวกันกับการบีบอัดซอฟต์แวร์ GUI ได้ การจัดเก็บชื่อไฟล์ลงในหน่วยความจำเป็นต้นนอกจากนี้ไฟล์ฝนตกหนักต้องเก็บข้อมูลเมตาของไฟล์ ควรมีชื่อไฟล์ 5 ล้านชื่อไว้ในไฟล์ torrent
Ayesh K

@AyeshK True ซึ่งจะส่งผลต่อประสิทธิภาพเมื่อเพิ่ม / สร้างฝนตกหนักหรือตรวจสอบ checksums ถึงกระนั้นฉันเชื่อว่านี่เป็นทางออกที่เสถียรที่สุดสำหรับการถ่ายโอนข้อมูลจำนวนมาก
LaX

ฝนตกหนักมากที่สุดที่เคยแชร์คือ ~ 800gb ไฟล์ torrent เดี่ยวที่มีไฟล์ส่วนใหญ่มีไฟล์ประมาณ 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

ฉันไม่เห็นจุดที่ใช้ 7z ในการแยกเมื่อคุณสามารถใช้splitกับไฟล์. tar.gz และรับข้อมูลเมตาได้
njzk2

@ njzk2 มันยังแยก ในขั้นต้นมันมีการบีบอัดแบบมัลติเธรดด้วย LZMA2 ไม่มียูทิลิตี้ยูนิกซ์อื่นที่ฉันรับรู้ถึงการรองรับ 7z ยังมีโหมดการบีบอัดที่ไม่แข็งซึ่งเป็นขั้นตอนที่ยอดเยี่ยมไปข้างหน้าเมื่อเฉพาะไฟล์ที่เฉพาะเจาะจงที่จะต้องเข้าถึง wrt ไปยังtarวิธีการ
Stefano Sanfilippo


3

ฉันคลิกขวาที่โฟลเดอร์และคลิก "สร้างที่เก็บถาวร" และเลือกตัวเลือก. tar.gz โครงสร้างไดเรกทอรีมีความลึกมากกว่า 500,000 ไดเรกทอรี

ใช่โชคดีที่ได้รับการบรรจุ และเครื่องมือ GUI จะพยายามทำเช่นนั้นในระดับเสียงเดียวกันซึ่งหมายความว่า a) คุณต้องการพื้นที่ว่างอีก 1Tb และ b) ส่วนหัวของการอ่านไฟล์หนึ่งไฟล์และต่อท้ายไปยังที่เก็บถาวรจะไม่แข็งแรงเกินไปสำหรับไดรฟ์

ฉันเห็นความเป็นไปได้สองอย่าง:

1) rsync จากคอมพิวเตอร์ของคุณไปยังบุคคลที่สาม อย่างใดอย่างหนึ่งจะต้องมีที่อยู่ IP ทั่วโลกที่ไม่เปลี่ยนแปลงบ่อย ใหญ่ประโยชน์จาก rsync คือถ้าคุณได้รับการขัดจังหวะด้วยเหตุผลใด ๆ ก็สามารถเลือกที่เหลือออก การคัดลอก tarball 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

ซึ่งจะสร้าง 10 ไฟล์ซึ่งจะมีขนาดใหญ่ที่สุด 100GB แต่นั่นจะไม่ตอบปัญหา "OOM" ของคุณเนื่องจาก tar ควรที่จะสตรีมมันอ่าน / เขียนดังนั้นคอขวดจึงเป็น gzip


0

วิธีการเกี่ยวกับที่:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find การค้นหารายการต้นไม้ไดเรกทอรี
  • tar -T - อ่านรายการจาก stdin
  • -czf -สร้างการเก็บถาวรและเขียนไปยัง stdout, zgzips กระแส
  • ssh remotehost ลงชื่อเข้าใช้ remotehost โดยใช้ ssh
  • cd /target/dir/ เปลี่ยนเป็นไดเร็กทอรีเป้าหมาย
  • tar xzf - แยกกระแสที่เข้ามาจาก stdin

ตัวอย่างเล็กน้อยที่ดี แม้ว่าฉันคิดว่าความต้องการของเขาที่นี่เป็นคุณสมบัติการบีบอัดส่วนใหญ่เนื่องจากวัตถุประสงค์คือเพื่อ "ถ่ายโอนไปยังเพื่อน"
mveroone

การสร้างที่เก็บถาวรไม่สมบูรณ์จะทำให้เกิดความเสียหายเมื่อการเชื่อมต่อขัดข้องซึ่งไม่น่าเป็นไปได้อย่างสิ้นเชิงในขณะที่ถ่ายโอน 1 TB ไม่ว่าจะเกิดจากเครือข่ายขัดข้อง
Jonas Schäfer

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.