멀티 기가 바이트 텍스트 파일을 편집하는 방법은 무엇입니까? Vim이 작동하지 않습니다 = ([닫힘]


112

한 번에 작은 부분 만 메모리에로드하여 멀티 기가 바이트 텍스트 파일을 편집 할 수있는 편집기가 있습니까? Vim이 처리 할 수없는 것 같습니다 = (


저는 vim에 정말 큰 데이터 수집 파일을로드했고 문제없이 처리했습니다.
Rook

편집 요구에 따라 sed 또는 perl과 같은 것을 통해 파이프를 통해 검색 및 교체를 수행 할 수 있습니다.
El Yobo

23
실제로는 주제에서 벗어난 것이 아니며 많은 프로그래머가 때때로 UI 편집기를 보완하기 위해 vim을 사용합니다. 주제 질문은 실제 문제에 관한 것입니다. 우리 모두는 이런 종류의 작업에 대해 두 가지 좋은 스위스 군대 도구만을 알고 있으므로 vim을 너무 이국적이거나 외부 사이트로 취급하지 마십시오. 그래서 사람을위한 것입니다.
Sławomir Lenart

닫는 대신 SuperUser 또는 Linux / Unix 또는 VIM으로 이동하지 않는 이유는 무엇입니까?
user1271772

답변:


72

당신이 * nix에서 스크립트에있는 (그리고 거의) 전용 파일의 일부 (그리고 수정해야 가정) 경우합니다 (사용하여 파일을 분할 할 수 split개별적으로 편집해야합니다 (사용 명령) awk, sed또는 비슷한)하고 후에을 연결 완료되었습니다.

cat file2 file3 >> file1

10
좋은 팁. 나는 13GB (152.000.000 라인)의 sql-file을 가지고 있었고, "split -l 1000000"을 사용한 다음 내가 원하는 곳에 1 백만 라인 파일을 vim으로 편집하는 것이 훌륭하게 작동했습니다. 분할하는 데 10 분이 걸렸습니다. (나는 정력과 일이 원본 파일을 열려고하지만 사용할 수 너무 느렸다.)
Claes가 모 그렌

149

Ctrl-C는 파일로드를 중지합니다. 파일이 충분히 작 으면 모든 내용을로드하고로드 후 단계를 종료 한 것이 운이 좋았을 수 있습니다. 이 팁을 사용할 때 전체 파일이로드되었는지 확인하십시오.

Vim은 대용량 파일을 매우 잘 처리 할 수 ​​있습니다. 3.4GB 파일을 편집하고 줄을 삭제하는 등의 작업을했습니다. 명심해야 할 세 가지 사항 :

  1. Ctrl-C를 누르십시오. Vim은 처음에 전체 파일을 읽고, 구문 강조 표시 및 파일의 줄 수 등과 같은 작업을 수행합니다. Ctrl-C는이 열거 (및 구문 강조 표시)를 취소하고 화면에 표시하는 데 필요합니다.
  2. 읽기 전용 : Vim은 파일이 너무 커서. 편집을 수행 할 파일 복사. 나는 w했다! 파일을 저장하는 데 가장 많은 시간이 소요되었습니다.
  3. 줄로 이동 : 입력 :115355하면 115355 줄로 바로 이동합니다. 이는 대용량 파일에서 훨씬 더 빠릅니다. Vim은 줄 버퍼를로드 할 때마다 처음부터 스캔을 시작하는 것처럼 보이며 파일을 스캔하기 위해 Ctrl-F를 누르고 있으면 끝 부분에서 정말 느려진 것 같습니다.

참고-Ctrl-C를 눌러 Vim 인스턴스가 읽기 전용 인 경우 Vim이 전체 파일을 버퍼에로드하지 않았을 수 있습니다. 이 경우 저장하면 전체 파일이 아닌 버퍼에있는 내용 만 저장됩니다 . a G를 사용하여 끝으로 건너 뛰어 파일의 모든 행이 있는지 빠르게 확인할 수 있습니다 .


14
이 조언을 사용하여 vim에서 44GB의 wikipedia xml 덤프를 처리 할 수있었습니다. (ctrl-c).
vancan1ty 2013

1
Windows에서 2.5GB 로그 파일의 끝을 읽으려고했습니다. gvim에서 열면 할당 된 2GB 메모리를 초과하면 메모리 부족 오류가 발생했습니다. ctrl-c 트릭을 시도 할 때 파일을 메모리로로드하는 것을 중지했지만 gvim이로드 할 수있는 파일의 일부만 볼 수있었습니다. 따라서 ctrl-c를 누르기 전에 오래 기다릴수록 더 많은 파일을 볼 수 있습니다. 파일 끝으로 이동하거나 파일의 나머지 부분을로드하는 것은 불가능했습니다 (또는 방법을 몰랐습니다). vim이 작업에 적합하지 않다는 점에 다소 실망 스럽습니다. (결국 무료 전용 도구를 사용하여 파일을 100MB 파일로 분할했습니다.
slawek

14
나를 위해 작동하지 않습니다. 3GB 파일을로드하고 ctrl-c를 누르면 내용이 표시됩니다. 스크롤 등을 편집 할 수 있지만로드 된 부분의 끝에 도달하면 (5 %라고 가정 해 보겠습니다) 더 이상로드되지 않습니다.
Patryk 2014

1
확인 됨, user3338098. Ctrl-C를 누르고 전체 파일을로드하지 않는 경우 (다른 사용자가 설명했듯이) 저장하면로드 한 내용 만 저장됩니다. 이것이 아마도 처음에 읽기 전용으로 들어가는 이유 일 것입니다. 내 읽기 전용 포인트를 업데이트하여이를 확인하겠습니다.
Aaron R.

16
이 지침을 따르면 방금 다운로드 한 대용량 파일이 손상되었습니다. 기본적으로 데이터 손실을 유발하는 지침을 제공하므로 포인트 2를 완전히 제거해야합니다. 이는 게시물이 끝날 때까지 언급하지 않습니다.
Neobyte 2015-08-22

75

질식을 일으키는 플러그인 일 수 있습니다. (구문 강조, 접기 등)

플러그인없이 vim을 실행할 수 있습니다.

vim -u "NONE" hugefile.log

미니멀하지만 최소한 익숙한 vi 동작을 제공합니다.

syntax off

또 다른 명백한 것입니다. 설치를 정리하고 필요한 것을 소싱하십시오. 그것이 무엇을 할 수 있는지, 그리고 다른 수단을 통해 작업을 수행해야하는지 알 수 있습니다.


3
이것은 여전히 ... RAM에 전체 파일을로드
Totor

@Totor 예, 먼저 파일을 분할했지만 해당 설정은 무작위 자동 명령을 해제하여 최고의 vim 성능을 빠르게 제공합니다. 그게 내 요점이었다. 적절한 메모리를 가진 워크 스테이션은 공연에 가까운 파일을 처리 할 수 ​​있어야합니다.
michael

2
그래서 vim / vi는 파일이 가상 메모리 크기의 10 배일 때 쓸모가 없습니까?
user3338098

1
이 명령을 사용하여 2 초 이내에 250MB 파일을 열었습니다. 놀라운
user674669

20

split + vim 솔루션을 사용하여 @Al pachio가 제공 한 답변에 약간의 개선 사항이 있습니다. 파일 청크를 버퍼로 효과적으로 사용하여 glob으로 파일을 읽을 수 있습니다.

$ split -l 5000 myBigFile
xaa
xab
xac
...

$ vim xa*
#edit the files

:nw  #skip forward and write
:n!  #skip forward and don't save 

:Nw  #skip back and write
:N!  #skip back and don't save


8

나는 SQL 덤프를 약간 변경해야 할 때 주로 약 1GB의 파일을 사용하여 그렇게하려고했습니다. 저는 Windows를 사용하므로 큰 고통을 겪습니다. 심각하게 어렵습니다.

분명한 질문은 "왜 필요합니까?"입니다. 내가 두 번 이상이 더 시도 할 필요가 경험에서 말할 수 있습니다, 당신은 아마 정말 다른 방법을 찾으려고합니다.

그래서 어떻게하나요? 내가 한 몇 가지 방법이 있습니다. 때로는 vim 또는 nano를 사용하여 파일을 열 수 있으며 사용할 수 있습니다. 정말 힘든 고통이지만 효과가 있습니다.

그것이 작동하지 않으면 (귀하의 경우처럼) 몇 가지 옵션 만 있습니다. 필요한 변경 (예 : 검색 및 바꾸기)을 수행하는 작은 프로그램을 작성할 수 있습니다. 이를 수행 할 수있는 명령 줄 프로그램을 사용할 수 있습니다 (아마도 sed / awk / grep / etc로 수행 할 수 있습니까?).

그래도 작동하지 않으면 파일을 청크로 분할 한 다음 ( 분할 이 확실한 선택이지만 헤드 / 테일을 사용하여 원하는 부분을 얻을 수 있음) 필요한 부분을 편집 할 수 있습니다. 나중에 재결합합니다.

그래도 나를 믿고 다른 방법을 찾으십시오.


3
보통 sed는 이런 경우에 당신의 친구입니다. 편집자는 파일 상단에 몇 개의 문자를 삽입하고 다른 모든 항목을 아래로 밀어내는 방법을 알아내는 것을 정말 좋아하지 않습니다.
dkretz

@le dorfier : 네. 검색 / 교체를해야 할 때 sed를 사용했습니다. 그런 파일에서 몇 줄을 삭제해야했을 때 (정말 줄 몇 개 ) vim에서 할 수 있었지만 줄 사이를 이동하는 것 (실제 삭제도 마찬가지 임)은 시간이 많이 걸렸습니다. (응답하고 다시 그리는 데 초 이상). 나는 그 줄 중 하나에 몇 글자도 추가하고 싶지 않습니다.
MBCook

정확히 동일한 문제 .... 큰 테이블 또는 대상 시스템에 존재하지 않는 파일 그룹에 대한 SQL 스크립트 맨 위에있는 "using"문. 나는 Free File Splitter를 사용하여 그들을 파열시키고 아래의 명령 줄을 다시 결합합니다.
EBarr

6

16 진 편집기가 대용량 파일을 처리하는 것이 합리적으로 일반적이라고 생각합니다. Windows에서는 최대 8EB (80 억 기가 바이트)의 파일을 처리한다고 주장 하는 HxD 를 사용합니다.


14
나는 그들이 그것을 어떻게 테스트했는지 알고 싶습니다 ... : P
Shadow

리눅스에서 나는 추천한다hexedit
elig

4

저는 Charles CampbellLargeFile 플러그인 과 함께 Win7 x64에서 vim 7.3.3을 사용하여 멀티 기가 바이트의 일반 텍스트 파일을 처리하고 있습니다. 정말 잘 작동합니다.

당신이 바로 오길 바랍니다.


플러그인을 비활성화하려면 어떻게해야합니까? 예를 들어 Vim에서 파일을 열 때 강조 표시와 같은 다른 모든 확장 기능이 다시 작동하도록 하시겠습니까?
hhh

3

와우, 1GB 또는 2GB로도 vim이 질식하지 못했습니다. UltraEdit (Windows) 및 BBEdit (Mac)이 훨씬 더 큰 파일에 더 적합하다고 들었지만 개인적인 경험은 없습니다.




2

초대형 로그 파일을 위해 FAR Commander의 내장 편집기 / 뷰어를 사용했습니다.



1

제가 그런 것에 사용할 수 있었던 유일한 것은 제가 가장 좋아하는 Mac 헥스 편집기 인 0XED입니다. 그러나 그것은 수십 메가 바이트에서 큰 파일이라고 생각했습니다. 얼마나 멀리 갈지 모르겠습니다. 그래도 한 번에 파일의 일부만 메모리에로드한다고 확신합니다.


0

과거에는 파일이 매우 커질 때 분할 / 편집 / 결합 방식을 성공적으로 사용했습니다. 이 작업을 수행하려면 원본 파일에서 편집 할 텍스트의 위치를 ​​알아야합니다.

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