VIM에서 대용량 파일 작업


108

VIM에서 거대한 (~ 2GB) 파일을 열려고했지만 질식했습니다. 실제로 파일을 편집 할 필요가 없습니다. 효율적으로 이동하면됩니다.

VIM에서 대용량 파일로 작업하려면 어떻게해야합니까?


1
여기 에 비슷한 질문이 있습니다.
GeoAvila

5
Vim은 :set binary처음 에는 괜찮을 것입니다 ...
ephemient

1
이것은 새로운 퓨즈 파일 시스템의 좋은 대상입니다! splitfs 또는 그와 비슷한 것 ... 내가 그것에 빠져 있습니다!
rodrigo 2011-07-29

1
너무 늦었 ...이 이미 존재합니다 sourceforge.net/projects/joinsplitfs
로드리고

5
편집자가 아니라 호출기가 필요합니다! 아래 Jim의 답변을 참조하십시오.
Lester Cheung

답변:


85

오늘 편집 할 12GB 파일이있었습니다. vim LargeFile 플러그인이 작동하지 않았습니다. 여전히 내 모든 메모리를 사용하고 오류 메시지를 인쇄했습니다.

파일을 분할하고 부분을 편집 한 다음 다시 결합합니다. 그래도 두 배의 디스크 공간이 필요합니다.

  • 편집하려는 줄을 둘러싼 항목을 찾으십시오.

    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 라인 5 처리 후 sed 중단
  • SMALLPART좋아하는 편집기를 사용하여 편집 하십시오.

  • 파일 결합 :

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • 즉 : HUGEFILE에서 편집 된 행 (이 경우 상위 3 개 행)에서 편집 된 행 앞에있는 모든 행을 선택하고 편집 된 행 (이 경우에는 행 4 및 5)과 결합하고이 결합 된 행 세트를 사용하여 HUGEFILE에 해당 (이 경우 상위 5 개 줄)를 입력하고 모두 새 파일에 씁니다.

    HUGEFILE.new이제 편집 된 파일이되며 원본을 삭제할 수 있습니다 HUGEFILE.


30

이것은 수년 동안 반복되는 질문이었습니다. (숫자는 계속 바뀌지 만 개념은 동일합니다. 메모리보다 큰 파일을 어떻게 보거나 편집합니까?)

분명히 more또는 less좋은 단지 파일 --- 읽기에 접근 할 수 있습니다 less, 심지어 이벤트 vi스크롤 및 검색을위한 키 바인딩 등이.

"대용량 파일"에 대한 Freshmeat 검색은 두 명의 편집기가 특히 귀하의 필요에 적합 할 것임을 시사합니다.

하나는 lfhex ... 큰 파일 16 진 편집기 (Qt에 따라 다름)입니다. 분명히 GUI 사용이 필요합니다.

다른 하나는 콘솔 사용에 적합한 것 같습니다 : hed ... 그리고 vim비슷한 인터페이스 ( ex모드 포함 ?) 를 가지고 있다고 주장합니다 .

파일 전체를 메모리에로드하지 않고도 페이지를 넘길 수있는 Linux / UNIX 용 다른 편집기를 본 적이있을 것입니다. 그러나 나는 그들의 이름을 기억하지 못합니다. 나는 다른 사람들이 그러한 편집자들에게 그들의 링크를 추가하도록 장려하기 위해이 응답을 "wiki"항목으로 만들고 있습니다. (예, 저는 splitand를 사용하여 문제를 해결하는 방법에 대해 잘 알고 있습니다 cat.하지만 저는 편집자, 특히이를 제거하고 그러한 접근 방식에 수반되는 시간 / 대기 시간 및 디스크 공간 오버 헤드를 절약 할 수있는 콘솔 / 저주 편집자를 생각하고 있습니다) .


23

실제로 파일을 편집 할 필요가 없기 때문에 :

  1. view(또는 vim -R)은 대용량 파일에서 상당히 잘 작동합니다.
  2. 아니면 사용할 수 있습니다 more또는less

"초크"라는 말은 여는 데 시간이 걸린다는 뜻입니까? 아니면 실제로 충돌합니까? 2.7GB 파일을 열려면 최근에 출시되지 않은 Linux 상자에서 4 분이 조금 넘게 걸립니다 view. 물론, 그것은 정확히 즉각적인 것은 아니지만 작동합니다.
ChssPly76

네, 멈 춥니 다. 기다렸다면 결국 열릴 것이라고 확신합니다. 즉시 열리고 탐색에 익숙하기 때문에 덜 사용했습니다.
hoju

9

나는 nano (내가 가장 좋아하는 편집기)를 사용하는 Florian의 답변을 기반으로 작은 스크립트를 작성했습니다.

#!/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 행을 열고 편집 할 수 있으며 저장하고 종료하면 hugefile의 해당 행이 저장된 행으로 자동으로 덮어 쓰여집니다.


3

저도 같은 문제를 겪고 있지만, 그것은 3백기가바이트 mysql을 덤프하고 있었고, 난은 제거하고 싶었다 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먼저 exe가 필요로하는대로 실행하려면 다음과 같이 할 수 있습니다.ruby mreplace.rb ..
Smar

감사합니다 @ Steeve McCauley! 잘 하셨어요. 이 질문에 대한 답을 찾을 때 정확히 내가 찾고 있던 것.
네이트 리터


2

이미 늦었지만 편집하지 않고 파일을 탐색하려는 경우 cat에도 작업을 수행 할 수 있습니다.

% cat filename | less

또는 간단하게 :

% less filename

8
참고 cat팅 파일이 먼저 어느 파일 (그래서 메모리에 완전히 것 의미로, 미친 듯이 바보 less파일을 추구 할 수 있습니다) 또는 전혀 탐색했습니다 될 수 없다 cat정적 출력 스트림을 제공합니다.
Smar

1

emacs는 100 메가 바이트 단위의 파일과 매우 잘 작동합니다. 저는 로그 파일에 너무 많은 문제없이 사용했습니다.

그러나 일반적으로 어떤 종류의 분석 작업이있을 때 Perl 스크립트를 작성하는 것이 더 나은 선택이라는 것을 알게됩니다.


0

오래된 스레드. 그럼에도 불구하고 (말장난 :)).

 $less filename

편집을 원하지 않고 거대한 로그 파일을 조사하는 경우를 둘러 보면 덜 효율적으로 작동합니다.

vi와 같은 적은 작품에서 검색

가장 좋은 점은 대부분의 배포판에서 기본적으로 사용할 수 있다는 것입니다. 따라서 프로덕션 환경에서도 문제가되지 않습니다.


650MB 텍스트 파일에서 검색하는 것은 PITA로 입증되었습니다. LargeFile과 함께 vim을 사용하면 매력적으로 작동합니다.
MariusCC

2
@MariusCC 2GB 이상의 파일로 작업하지 않은 경우 충돌로 인해 매력이 사라집니다!
2015

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