ฉันพยายามเปิดไฟล์ขนาดใหญ่ (~ 2GB) ใน VIM แต่มันสำลัก ฉันไม่จำเป็นต้องแก้ไขไฟล์จริงๆแค่ข้ามไปอย่างมีประสิทธิภาพ
ฉันจะทำงานกับไฟล์ขนาดใหญ่มากใน VIM ได้อย่างไร
:set binary
ครั้งแรก ...
ฉันพยายามเปิดไฟล์ขนาดใหญ่ (~ 2GB) ใน VIM แต่มันสำลัก ฉันไม่จำเป็นต้องแก้ไขไฟล์จริงๆแค่ข้ามไปอย่างมีประสิทธิภาพ
ฉันจะทำงานกับไฟล์ขนาดใหญ่มากใน VIM ได้อย่างไร
:set binary
ครั้งแรก ...
คำตอบ:
วันนี้ฉันมีไฟล์ 12GB ที่ต้องแก้ไข ปลั๊กอินกลุ่ม LargeFile ใช้งานไม่ได้สำหรับฉัน มันยังคงใช้หน่วยความจำของฉันจนหมดแล้วจึงพิมพ์ข้อความแสดงข้อผิดพลาด :-( ฉันไม่สามารถใช้เลขฐานสิบหกสำหรับทั้งสองอย่างได้เนื่องจากไม่สามารถแทรกอะไรได้เลยเพียงแค่เขียนทับนี่คือแนวทางอื่น:
คุณแยกไฟล์แก้ไขส่วนต่างๆแล้วนำมารวมกันใหม่ คุณยังคงต้องการพื้นที่ดิสก์สองเท่า
Grep สำหรับบางสิ่งรอบ ๆ บรรทัดที่คุณต้องการแก้ไข:
grep -n 'something' HUGEFILE | head -n 1
แตกช่วงของไฟล์นั้น พูดว่าบรรทัดที่คุณต้องการแก้ไขอยู่ที่บรรทัดที่ 4 และ 5 จากนั้นทำ:
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
ตัวเลือกที่เป็นสิ่งจำเป็นเพื่อให้การปราบปรามการทำงานเริ่มต้นของ sed พิมพ์ทุกอย่าง4,5p
พิมพ์บรรทัดที่ 4 และ 55q
ยกเลิก sed หลังจากสายการประมวลผล 5 แก้ไขSMALLPART
โดยใช้โปรแกรมแก้ไขที่คุณชื่นชอบ
รวมไฟล์:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
ตอนนี้จะเป็นไฟล์ที่คุณแก้ไขคุณสามารถลบต้นฉบับHUGEFILE
ได้
นี่เป็นคำถามซ้ำซากมาหลายปีแล้ว (ตัวเลขเปลี่ยนแปลงไปเรื่อย ๆ แต่แนวคิดยังเหมือนเดิม: ฉันจะดูหรือแก้ไขไฟล์ที่มีขนาดใหญ่กว่าหน่วยความจำได้อย่างไร)
เห็นได้ชัดmore
หรือless
เป็นแนวทางที่ดีในการอ่านไฟล์เท่านั้น - less
แม้กระทั่งข้อเสนอvi
เช่นการเชื่อมโยงคีย์สำหรับการเลื่อนและการค้นหา
การค้นหาFreshmeatเกี่ยวกับ "ไฟล์ขนาดใหญ่" แสดงให้เห็นว่าผู้แก้ไขสองคนเหมาะกับความต้องการของคุณเป็นพิเศษ
หนึ่งจะเป็น: lfhex ... ตัวแก้ไขไฟล์ hex ขนาดใหญ่ (ซึ่งขึ้นอยู่กับ Qt) เห็นได้ชัดว่าสิ่งนั้นเกี่ยวข้องกับการใช้ GUI
อีกอันดูเหมือนจะเหมาะกับการใช้คอนโซล: hed ... และอ้างว่ามีvim
อินเทอร์เฟซที่เหมือนกัน (รวมถึงex
โหมด?)
ฉันแน่ใจว่าฉันเคยเห็นตัวแก้ไขอื่น ๆ สำหรับ Linux / UNIX ที่สามารถเพจผ่านไฟล์ต่างๆได้โดยไม่ต้องโหลดไฟล์ทั้งหมดลงในหน่วยความจำ อย่างไรก็ตามฉันจำชื่อพวกเขาไม่ได้ ฉันกำลังทำให้คำตอบนี้เป็นรายการ "wiki" เพื่อกระตุ้นให้ผู้อื่นเพิ่มลิงก์ไปยังผู้แก้ไขดังกล่าว (ใช่ฉันคุ้นเคยกับวิธีการแก้ไขปัญหาโดยใช้split
และcat
; แต่ฉันกำลังคิดถึงผู้แก้ไขโดยเฉพาะผู้แก้ไขคอนโซล / คำสาปซึ่งสามารถจ่ายสิ่งนั้นได้และช่วยเราประหยัดเวลา / เวลาแฝงและค่าใช้จ่ายในดิสก์ที่แนวทางดังกล่าวเกิดขึ้น) .
เนื่องจากคุณไม่จำเป็นต้องแก้ไขไฟล์จริง:
view
(เพิ่งลองและหมดเวลา) จริงอยู่นั่นไม่ใช่ในทันที แต่ได้ผล
ฉันเขียนสคริปต์เล็กน้อยตามคำตอบของ Florian ที่ใช้ nano (ตัวแก้ไขที่ฉันชอบ):
#!/bin/sh
if [ "$#" -ne 3 ]; then
echo "Usage: $0 hugeFilePath startLine endLine" >&2
exit 1
fi
sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
nano hfnano_temporary_file
(head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
cat hfnano_temporary_file2 > $1
rm hfnano_temporary_file hfnano_temporary_file2
ใช้แบบนี้:
sh hfnano yourHugeFile 3 8
ในตัวอย่างนั้น nano จะเปิดบรรทัดที่ 3 ถึง 8 คุณสามารถแก้ไขได้และเมื่อคุณบันทึกและออกบรรทัดเหล่านั้นในไฟล์ขนาดใหญ่จะถูกเขียนทับโดยอัตโนมัติด้วยบรรทัดที่คุณบันทึกไว้
ฉันมีปัญหาเดียวกัน แต่เป็นการถ่ายโอนข้อมูล mysql ขนาด 300GB และฉันต้องการกำจัดDROP
และเปลี่ยนCREATE TABLE
เป็นCREATE TABLE IF NOT EXISTS
ดังนั้นไม่ต้องการเรียกใช้การเรียกใช้sed
ไฟล์. ฉันเขียนสคริปต์ Ruby ฉบับย่อนี้เพื่อหลอกลวงไฟล์ด้วยการเปลี่ยนแปลงเหล่านั้น:
#!/usr/bin/env ruby
matchers={
%q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
%q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
}
matchers.each_pair { |m,r|
STDERR.puts "%s: %s" % [ m, r ]
}
STDIN.each { |line|
#STDERR.puts "line=#{line}"
line.chomp!
unless matchers.length == 0
matchers.each_pair { |m,r|
re=/#{m}/
next if line[re].nil?
line.sub!(re,r)
STDERR.puts "Matched: #{m} -> #{r}"
matchers.delete(m)
break
}
end
puts line
}
เรียกเช่น
./mreplace.rb < foo.sql > foo_two.sql
chmod +x mreplace.rb
ก่อนคุณสามารถทำได้เช่นกันruby mreplace.rb ..
สำหรับหนึ่งสมุทรขนาดใหญ่ (พิมพ์อักขระจาก1
ถึง99
):
cut -c 1-99 filename
มันสายไปแล้ว แต่ถ้าคุณแค่ต้องการเลื่อนดูไฟล์โดยไม่แก้ไขก็cat
สามารถทำงานได้เช่นกัน
% cat filename | less
หรืออีกทางเลือกหนึ่งง่ายๆ:
% less filename
cat
การปรับแต่งไฟล์ก่อนเป็นสิ่งที่โง่เขลาอย่างมากเนื่องจากอาจหมายความว่าไฟล์จะอยู่ในหน่วยความจำเต็ม (จึงless
สามารถค้นหาไฟล์ได้) หรือไม่สามารถค้นหาได้เลย cat
ให้กระแสเอาต์พุตแบบคงที่
emac ทำงานได้ดีกับไฟล์ใน 100 เมกะไบต์ฉันใช้กับไฟล์บันทึกโดยไม่มีปัญหามากเกินไป
แต่โดยทั่วไปเมื่อฉันมีงานวิเคราะห์บางอย่างฉันพบว่าการเขียนสคริปต์ perl เป็นทางเลือกที่ดีกว่า
กระทู้เก่า. แต่อย่างไรก็ตาม (เล่นสำนวน :))
$less filename
ทำงานได้น้อยลงหากคุณไม่ต้องการแก้ไขและเพียงแค่มองไปรอบ ๆ ซึ่งเป็นกรณีสำหรับการตรวจสอบไฟล์บันทึกขนาดใหญ่
ค้นหาโดยใช้งานน้อยลงเช่น vi
ส่วนที่ดีที่สุดมันพร้อมใช้งานโดยค่าเริ่มต้นใน Distros ส่วนใหญ่ ดังนั้นจะไม่เป็นปัญหาสำหรับสภาพแวดล้อมการผลิตเช่นกัน
นี่เก่า แต่ใช้ nano, vim หรือ gvim