16GB RAM이 있는데 Vim에서 100MB 텍스트 파일을 열 수없는 이유는 무엇입니까?


67

100MB MySQL 데이터베이스 백업 파일이 있고 16G RAM이있는 Linux 상자의 Vim에서 파일을 여는 데 문제가 있습니다.

Vim은 멈 춥니 다 (적어도 사용할 수 없음). 이것은 내가 이해하지 못하는 것입니다. RAM이 16GB인데 편집기에서 100MB 파일을로드 할 수없는 이유는 무엇입니까?

Vim 때문입니까? 모든 메모리 관리가 OS에서 처리된다고 생각했습니다.


3
이러한 파일을 보려면 텍스트 편집기 대신 HEX 편집기를 사용하십시오. vi와 유사한 인터페이스를 가진 16 진 편집기의 예는 다음과 같습니다 hexer.
Ruslan

13
현재 수십 년 동안 메모리가 부족할 때 RAM이 부족 하지 않았 음을 잊지 마십시오 . 메모리는 이제 가상화되었습니다. 페이지로 분할되며 해당 페이지를 디스크로 스왑 할 수 있습니다. 프로세스의 주소 공간에서 할당 된 메모리의 양과 소비되는 RAM의 양은 서로 거의 관련이 없습니다. 메모리가 부족하면 RAM이 아닌 주소 공간이 부족한 것입니다 . 메모리 를 생각하는 가장 좋은 방법 은 디스크 공간 이고, 각 프로세스는 일정한 양의 공간을 확보하고 RAM은 디스크를 더 빠르게 만드는 하드웨어입니다 .
Eric Lippert

21
@EricLippert 기존 디스크가 너무 느려서 (RAM에 비해) 활성 상태가 아닌 가상 메모리 페이지를 저장하는 데만 적합합니다. 스왑 스 래싱으로 인해 프로세스가 중단되거나 최소한 OP에서 사용할 수없는 경우 프로세스가 중단되면 RAM이 부족한 것입니다.
depquid 2016 년

6
주소 공간이 부족한 @EricLippert는 현재 32 비트 시스템에만 관련이 있습니다. 16G RAM을 사용하는 사용자는 일반 64 비트 대신 32 비트 PAE 커널을 계속 사용합니다.
Ruslan

3
@depquid : 좋은 지적입니다. 필자의 의견은 OP가 "100MB의 데이터를로드하고 16000MB의 RAM을 가지고 있기 때문에 16000MB의 RAM 중 100MB가 소비되었다"는 믿음을 가지고있는 것 같습니다. 이 신념 체계는 구식입니다.
Eric Lippert

답변:


69

Vim은 때때로 비정상적으로 긴 줄을 가진 파일에 문제가 있습니다. 텍스트 편집기이므로 줄 길이가 최대 수백자인 텍스트 파일 용으로 설계되었습니다.

데이터베이스 파일에는 개행 문자가 많지 않을 수 있으므로 100Mb 길이의 단일 행일 수 있습니다. Vim은 그것에 만족하지 않을 것입니다. 아마 작동하지만 파일을로드하는 데 시간이 오래 걸릴 수 있습니다.

Vim을 사용하여 100Mb보다 훨씬 큰 텍스트 파일 을 확실히 열었습니다 . Vim은 필요에 따라 변경 사항을 디스크로 바꿀 수 있으므로 파일을 한 번에 메모리에 넣을 필요조차 없습니다.


1
나는 또한 매우 긴 줄을 발견하고 매우 긴 줄없이 다른 파일로 시도해 보았습니다. 감사합니다
묻고 배우기

11
@AskandLearn 파일 형식에 따라 set synmaxcol=120(또는 다른 적절한 숫자) 성능이 향상 될 수 있습니다 . 나는 과거에 이것으로부터 엄청난 속도 향상을 보았습니다.
sapi

최근 네오 빔 포크가 더 긴 라인을 더 잘 처리 할 수 ​​있는지 아는 사람이 있습니까? 나는 그것이 일반적인 문제가 아니라고 생각합니다 ...
Hemmer

@GregHewgill 사실이지만, 나는 그것을 관찰했지만 어떻게 알았습니까?
Rahul Patil

56

내 경험상 Vim은 큰 파일 이 아니라 긴 줄 에 질식했다 . 하려면이 명령을 사용하여 mysqldump사용에게 짧은 선 a의 비용으로 큰 파일을 :

$ mysqldump --complete-insert -u -p

또한 Vim을 열고 .vimrc다음 명령으로 파일 을 구문 분석 하거나 플러그인을로드 하지 않도록 요청할 수 있습니다 .

$ vim -u NONE output.sql

이 방법으로 Vim을로드하면 메모리가 적게 사용되며 많은 플러그인처럼 Vim이 전체 파일을 구문 분석하지 않아도됩니다.


15

.vimrc 및 플러그인없이 VIM로드 (예 : VIM 정리) 예를 들어 HUGE 파일

  gvim -u NONE -U NONE -N largefile.sql

13

큰 파일을 직접 보려면 less대신 사용하십시오 vim. Vim은 처음로드 할 때 파일을 스캔하고 (잠재적으로 여러 단계로) 사용할 구문을 결정하기 위해 구문 강조를 수행하고 파일의 맨 위와 맨 아래에서 모델을 검색하려고합니다. 그런 다음 파일을 편집 할 때 vim은 스왑 파일을 저장하고 실행 취소 트리를 유지합니다 (vim의 실행 취소 기록은 다른 모든 편집기에서와 같이 선형이 아닌 분기됩니다). 텍스트가 변경되면 구문 강조 표시를 지속적으로 다시 평가합니다.

거대한 파일에서는 왜 그렇게 사용할 수 없는지에 대한 정당화는 아니지만, 그 이유에 대한 더 자세한 설명입니다.


VIM이 파일 구문 분석과 같은 무거운 작업을 수행하지 못하게하는 방법에 대한 답변을 참조하십시오.
dotancohen

XML과 SQL 같은 것들에 대한 구문 강조는 더 큰 파일에서 매우 느려질 수 있습니다.
Marcin

9

Vim은 파일을 그대로 메모리에로드하지 않습니다. 내부 구조 (줄, 단어 등)로 변환하고 내부 스크립트 언어 등을 사용하여 구문 강조를 수행합니다. 모두 메모리 (문자의 바이트보다 훨씬 많은)와 CPU 시간을 소비합니다.


메모리 소비는 문제가 아닙니다. CPU 시간이 걸리고 있습니다 (기다리는 동안 눈에 띄는 정지).
궤도에서 가벼움 레이스

이 CPU 시간은 대부분 구문 강조 스크립트에 의해 사용됩니다.
demonkoryu

그래, 난 동의. 나는 단지 메모리 사용이 (a) 문제가되거나 (b) 대답이 말한 것과 반대로 오랜 지연을 일으킬 가능성이 거의 없다고 말하고 있습니다.
궤도에서 가벼움 경주

네 말이 맞아, 나는 그에 따라 대답을 업데이트했다.
demonkoryu


4

VIM이 RAM보다 더 많은 임시 파일 (예 : 스왑)을 필요로하는 문제와 관련이 있기를 바랍니다.

대부분의 경우 VIM이 생성 한 임시 파일은 열려는 파일의 동일한 디렉토리에 있습니다. 이 경우 현재 디렉토리에서 사용 가능한 디스크 공간을 확인하여 확인할 수 있습니다.

다행히 VIM의 인덱싱 / 스왑 파일에 다른 위치를 지정하는 방법에 대한 유용한 문서가 있습니다.

스왑 파일을 비활성화 할 수도 있습니다


1

때때로 .sql 텍스트 형식으로 큰 데이터베이스 백업을 엽니 다. 매우 큰 파일 또는 매우 긴 줄을 가진 파일은 종종 vim에서 여는 데 시간이 오래 걸리는 것 같습니다. @zzapper와 @demonkoryu의 답변에서 언급했듯이 구문 처리 및 색상 강조와 관련이 있습니다.

빠른 해결 방법은 파일을로드하는 동안 "control-G"를 눌러 구문 강조 전처리를 취소하는 것입니다.

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