การทำงานกับไฟล์ขนาดใหญ่ใน VIM


108

ฉันพยายามเปิดไฟล์ขนาดใหญ่ (~ 2GB) ใน VIM แต่มันสำลัก ฉันไม่จำเป็นต้องแก้ไขไฟล์จริงๆแค่ข้ามไปอย่างมีประสิทธิภาพ

ฉันจะทำงานกับไฟล์ขนาดใหญ่มากใน VIM ได้อย่างไร


1
นี่คือคำถามที่คล้ายกัน
GeoAvila

5
กลุ่มควรจะโอเคตราบเท่าที่คุณเป็น:set binaryครั้งแรก ...
ephemient

1
นี่เป็นเป้าหมายที่ดีสำหรับระบบไฟล์ฟิวส์ใหม่! Splitfsหรืออะไรทำนองนั้น ... ฉันชอบมัน!
rodrigo

1
สายเกินไป ... มีอยู่แล้ว: sourceforge.net/projects/joinsplitfs
rodrigo

5
คุณต้องมีเพจเจอร์ไม่ใช่บรรณาธิการครับ! ดูคำตอบของ Jim ด้านล่าง
Lester Cheung

คำตอบ:


85

วันนี้ฉันมีไฟล์ 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 และ 5
    • 5q ยกเลิก sed หลังจากสายการประมวลผล 5
  • แก้ไขSMALLPARTโดยใช้โปรแกรมแก้ไขที่คุณชื่นชอบ

  • รวมไฟล์:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • กล่าวคือ: เลือกบรรทัดทั้งหมดก่อนบรรทัดที่แก้ไขจาก HUGEFILE (ซึ่งในกรณีนี้คือ 3 บรรทัดบนสุด) รวมเข้ากับบรรทัดที่แก้ไข (ในกรณีนี้คือบรรทัดที่ 4 และ 5) และใช้ชุดของบรรทัดรวมนี้เพื่อแทนที่ เทียบเท่า (ในกรณีนี้คือ 5 บรรทัดแรก) ใน HUGEFILE และเขียนทั้งหมดลงในไฟล์ใหม่

    HUGEFILE.newตอนนี้จะเป็นไฟล์ที่คุณแก้ไขคุณสามารถลบต้นฉบับHUGEFILEได้


30

นี่เป็นคำถามซ้ำซากมาหลายปีแล้ว (ตัวเลขเปลี่ยนแปลงไปเรื่อย ๆ แต่แนวคิดยังเหมือนเดิม: ฉันจะดูหรือแก้ไขไฟล์ที่มีขนาดใหญ่กว่าหน่วยความจำได้อย่างไร)

เห็นได้ชัดmoreหรือlessเป็นแนวทางที่ดีในการอ่านไฟล์เท่านั้น - lessแม้กระทั่งข้อเสนอviเช่นการเชื่อมโยงคีย์สำหรับการเลื่อนและการค้นหา

การค้นหาFreshmeatเกี่ยวกับ "ไฟล์ขนาดใหญ่" แสดงให้เห็นว่าผู้แก้ไขสองคนเหมาะกับความต้องการของคุณเป็นพิเศษ

หนึ่งจะเป็น: lfhex ... ตัวแก้ไขไฟล์ hex ขนาดใหญ่ (ซึ่งขึ้นอยู่กับ Qt) เห็นได้ชัดว่าสิ่งนั้นเกี่ยวข้องกับการใช้ GUI

อีกอันดูเหมือนจะเหมาะกับการใช้คอนโซล: hed ... และอ้างว่ามีvimอินเทอร์เฟซที่เหมือนกัน (รวมถึงexโหมด?)

ฉันแน่ใจว่าฉันเคยเห็นตัวแก้ไขอื่น ๆ สำหรับ Linux / UNIX ที่สามารถเพจผ่านไฟล์ต่างๆได้โดยไม่ต้องโหลดไฟล์ทั้งหมดลงในหน่วยความจำ อย่างไรก็ตามฉันจำชื่อพวกเขาไม่ได้ ฉันกำลังทำให้คำตอบนี้เป็นรายการ "wiki" เพื่อกระตุ้นให้ผู้อื่นเพิ่มลิงก์ไปยังผู้แก้ไขดังกล่าว (ใช่ฉันคุ้นเคยกับวิธีการแก้ไขปัญหาโดยใช้splitและcat; แต่ฉันกำลังคิดถึงผู้แก้ไขโดยเฉพาะผู้แก้ไขคอนโซล / คำสาปซึ่งสามารถจ่ายสิ่งนั้นได้และช่วยเราประหยัดเวลา / เวลาแฝงและค่าใช้จ่ายในดิสก์ที่แนวทางดังกล่าวเกิดขึ้น) .


23

เนื่องจากคุณไม่จำเป็นต้องแก้ไขไฟล์จริง:

  1. view(หรือvim -R) ควรทำงานได้ดีพอสมควรกับไฟล์ขนาดใหญ่
  2. หรือคุณสามารถใช้moreหรือless

โดย "chokes" คุณหมายถึงต้องใช้เวลาสักครู่ในการเปิด? หรือล่มจริง? ใช้เวลานานกว่า 4 นาทีในกล่อง Linux ที่ยังไม่ล่าสุดของฉันในการเปิดไฟล์ 2.7GB ในview(เพิ่งลองและหมดเวลา) จริงอยู่นั่นไม่ใช่ในทันที แต่ได้ผล
ChssPly76

ใช่มันแผงลอย ฉันแน่ใจว่าฉันรอมันจะเปิดในที่สุด ฉันไปน้อยลงเพราะมันเปิดขึ้นทันทีและฉันคุ้นเคยกับการนำทาง
hoju

9

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


3

ฉันมีปัญหาเดียวกัน แต่เป็นการถ่ายโอนข้อมูล 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

เพียงเพื่อทราบสำหรับการเรียกใช้เพื่อเรียกใช้เป็น exe ต้องใช้chmod +x mreplace.rbก่อนคุณสามารถทำได้เช่นกันruby mreplace.rb ..
Smar

ขอบคุณ @Steeve McCauley! ทำได้ดีมาก สิ่งที่ฉันกำลังมองหาเมื่อค้นหาคำตอบสำหรับคำถามนี้
Nate Ritter


2

มันสายไปแล้ว แต่ถ้าคุณแค่ต้องการเลื่อนดูไฟล์โดยไม่แก้ไขก็catสามารถทำงานได้เช่นกัน

% cat filename | less

หรืออีกทางเลือกหนึ่งง่ายๆ:

% less filename

8
โปรดทราบว่าcatการปรับแต่งไฟล์ก่อนเป็นสิ่งที่โง่เขลาอย่างมากเนื่องจากอาจหมายความว่าไฟล์จะอยู่ในหน่วยความจำเต็ม (จึงlessสามารถค้นหาไฟล์ได้) หรือไม่สามารถค้นหาได้เลย catให้กระแสเอาต์พุตแบบคงที่
Smar

1

emac ทำงานได้ดีกับไฟล์ใน 100 เมกะไบต์ฉันใช้กับไฟล์บันทึกโดยไม่มีปัญหามากเกินไป

แต่โดยทั่วไปเมื่อฉันมีงานวิเคราะห์บางอย่างฉันพบว่าการเขียนสคริปต์ perl เป็นทางเลือกที่ดีกว่า


0

กระทู้เก่า. แต่อย่างไรก็ตาม (เล่นสำนวน :))

 $less filename

ทำงานได้น้อยลงหากคุณไม่ต้องการแก้ไขและเพียงแค่มองไปรอบ ๆ ซึ่งเป็นกรณีสำหรับการตรวจสอบไฟล์บันทึกขนาดใหญ่

ค้นหาโดยใช้งานน้อยลงเช่น vi

ส่วนที่ดีที่สุดมันพร้อมใช้งานโดยค่าเริ่มต้นใน Distros ส่วนใหญ่ ดังนั้นจะไม่เป็นปัญหาสำหรับสภาพแวดล้อมการผลิตเช่นกัน


ค้นหาในไฟล์ข้อความ 650MB ที่พิสูจน์แล้วว่าเป็น PITA น้อยกว่า การใช้ vim กับ LargeFile ทำงานเหมือนเสน่ห์
MariusCC

2
@MariusCC ถ้าอย่างนั้นคุณไม่ได้ทำงานกับไฟล์มากกว่า 2 GB เสน่ห์ของคุณจะจางหายไปด้วยความผิดพลาด!
deepdive

-15

นี่เก่า แต่ใช้ nano, vim หรือ gvim


5
เครื่องมือเหล่านี้ไม่ได้ทำอะไรเพื่อแก้ไขปัญหา
Doug Wolfgram

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