วิธีกระจายไฟล์ขนาดใหญ่บน Linux


31

ฉันได้รับdiff: memory exhaustedข้อผิดพลาดเมื่อพยายามกระจายไฟล์ 27 GB สองไฟล์ซึ่งส่วนใหญ่คล้ายกันในกล่อง Linux พร้อม CentOS 5 และ 4 GB of RAM นี่เป็นปัญหาที่ทราบกันแล้วดูเหมือนว่า

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

  • ฉันพยายามใช้rdiffและxdeltaแต่ก็เป็นการดีกว่าสำหรับการแสดงการเปลี่ยนแปลงระหว่างสองไฟล์เช่นแพทช์และไม่ได้มีประโยชน์สำหรับการตรวจสอบความแตกต่างระหว่างสองไฟล์
  • พยายามVBinDiffแต่มันเป็นเครื่องมือภาพที่ดีกว่าสำหรับการเปรียบเทียบไฟล์ไบนารี ฉันต้องการสิ่งที่ท่อสามารถที่แตกต่างกันเพื่อ STDOUT diffเหมือนปกติ
  • มียูทิลิตีอื่น ๆ มากมายเช่นvimdiffใช้งานได้กับไฟล์ขนาดเล็ก
  • ฉันได้อ่านเกี่ยวกับ Solaris แล้วbdiffแต่ฉันไม่สามารถหาพอร์ตสำหรับ Linux ได้

มีข้อคิดเห็นใดบ้างนอกเหนือจากการแยกไฟล์ออกเป็นชิ้นเล็ก ๆ ฉันมีไฟล์เหล่านี้ 40 ไฟล์ดังนั้นพยายามหลีกเลี่ยงการทำลายมัน


คุณลอง xdelta รุ่นใด xdelta3 หรือ xdelta1
nmuntz

เป็นรุ่น 1.1.4 xdelta3 มีฟังก์ชันการทำงานที่แตกต่างกันหรือไม่? ฉันเพิ่งตรวจสอบเอกสารออนไลน์และดูเหมือนว่ายังคงเกี่ยวกับการให้บริการ "deltas"
Tom B


ดูคำตอบนี้: unix.stackexchange.com/a/77259/27186
unhammer

คำตอบ:


12

cmpทำสิ่งต่าง ๆ แบบไบต์ต่อไบต์ดังนั้นมันอาจจะไม่เพียงพอหน่วยความจำ (เพิ่งทดสอบในสองไฟล์ 7 GB) - แต่คุณอาจมองหารายละเอียดมากกว่ารายการ "ไฟล์XและYแตกต่างกันที่ไบต์x , บรรทัดy " หากความคล้ายคลึงกันของไฟล์ของคุณถูกชดเชย (เช่นไฟล์Yมีบล็อกข้อความเหมือนกัน แต่ไม่อยู่ในตำแหน่งเดียวกัน) คุณสามารถส่งผ่านออฟเซ็cmpตได้ คุณสามารถเปลี่ยนให้เป็นการซิงโครไนซ์เปรียบเทียบกับสคริปต์ขนาดเล็กอีกครั้ง

นอกเหนือ: ในกรณีที่มีผู้อื่นมาที่นี่เมื่อมองหาวิธีการยืนยันว่าโครงสร้างไดเรกทอรีสอง (มีไฟล์ขนาดใหญ่มาก) เหมือนกัน: diff --recursive --brief(หรือdiff -r -qสั้นหรืออาจจะdiff -rq) จะทำงานและไม่ได้ใช้หน่วยความจำไม่เพียงพอ


ดีผมคิดว่า -q เป็นกุญแจสำคัญที่นี่ไม่ได้มีอย่างใดมันจะต้องแตกต่างที่จะนำไฟล์ทั้งหมด (หรืออย่างน้อยสายทั้งหมด) ในหน่วยความจำ ...
rogerdpack

7

ฉันพบลิงค์นี้

diff -H อาจช่วยได้หรือคุณสามารถลองติดตั้งพอร์ต textproc / 2bsd-diff ซึ่งเห็นได้ชัดว่าไม่ได้พยายามโหลดไฟล์ลงใน RAM ดังนั้นจึงสามารถทำงานกับไฟล์ขนาดใหญ่ได้ง่ายขึ้น

ฉันไม่แน่ใจว่าคุณได้ลองทั้งสองตัวเลือกหรืออาจใช้งานได้สำหรับคุณ โชคดี.


1
สิ่งนี้ช่วยให้ทุกคนออกไปข้างนอกหรือเปล่า? สำหรับผมความล้มเหลวเดียวกัน ...
rogerdpack

12
สำหรับทุกคนที่สงสัยเป็นนามแฝงที่ไม่มีเอกสารและเลิกใช้diff -H diff --speed-large-files
a3nm

1
คำตอบนี้ไม่ได้ช่วย นี่เป็นคำถามของ linux และการติดตั้ง 2bsd-diff คุณจะต้องทำการพอร์ตก่อน หลังจากที่คุณพบแหล่งที่มา และpatched มัน เป็นไปได้ แต่ไม่น่าจะเป็นทางออกที่ปฏิบัติได้
nyov

1

หากไฟล์เหมือนกัน (ความยาวเท่ากัน) ยกเว้นค่าสองสามไบต์คุณสามารถใช้สคริปต์ดังต่อไปนี้ ( wคือจำนวนไบต์ต่อบรรทัดเป็น hexdump ปรับความกว้างหน้าจอของคุณ):

w=12;
while read -ru7 x && read -ru8 y;
do
  [ ".$x" = ".$y" ] || echo "$x | $y";
done 7< <(od -vw$w -tx1z FILE1) 8< <(od -vw$w -tx1z FILE2) > DIFF-FILE1-FILE2 &

less DIFF-FILE1-FILE2

มันไม่เร็วมาก แต่ทำงานได้

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