Tại sao Vim không thể mở tệp văn bản 100 MB khi tôi có 16 GB RAM?


67

Tôi có tệp sao lưu cơ sở dữ liệu MySQL 100 MB và tôi gặp sự cố khi mở tệp này trong Vim trên hộp Linux có 16G RAM.

Vim chỉ bị treo (ít nhất là không sử dụng được). Đây là điều tôi không hiểu. Tôi có RAM 16 GB, tại sao tôi không thể tải tệp 100 MB trong trình chỉnh sửa?

Có phải vì Vim? Tôi nghĩ rằng tất cả quản lý bộ nhớ được xử lý bởi hệ điều hành.


3
Cân nhắc sử dụng trình soạn thảo HEX thay vì trình soạn thảo văn bản để xem các tệp đó. Một ví dụ về trình soạn thảo hex với giao diện giống như vi sẽ là hexer.
Ruslan

13
Đừng quên rằng RAM không phải là thứ chúng ta cạn kiệt khi chúng ta hết bộ nhớ trong nhiều thập kỷ nay. Bộ nhớ hiện được ảo hóa; nó được chia thành các trang và những trang đó có thể được hoán đổi vào đĩa. Dung lượng bộ nhớ được phân bổ ngoài không gian địa chỉ của quy trình và lượng RAM tiêu thụ có rất ít liên quan đến nhau. Khi bạn hết bộ nhớ, bạn đã hết dung lượng địa chỉ , không phải RAM . Cách tốt nhất để nghĩ về nó là bộ nhớ là dung lượng ổ đĩa , mỗi quá trình sẽ có một lượng không gian cố định nhất định và RAM là phần cứng giúp đĩa của bạn nhanh hơn .
Eric Lippert

21
@EricLippert Ngoại trừ việc các đĩa truyền thống quá chậm (so với RAM) đến mức chúng chỉ phù hợp để lưu trữ các trang bộ nhớ ảo không được sử dụng. Nếu một quá trình bị treo (hoặc ít nhất là không thể sử dụng được, như OP đã đặt nó) do quá trình hoán đổi trao đổi, thì đó chính xác là do RAM là thứ đã hết.
tước

6
@EricLippert hết dung lượng địa chỉ chỉ có liên quan trên các hệ thống 32 bit hiện nay. Tôi nghi ngờ rằng người dùng có RAM 16G vẫn sẽ sử dụng kernel PAE 32 bit thay vì 64 bit thông thường.
Ruslan

3
@depquid: Đó là một điểm tốt; Sức mạnh của nhận xét của tôi là OP dường như có niềm tin rằng "Tôi đã tải 100 MB nội dung, tôi có 16000 MB RAM, do đó, 100 MB RAM 16000 MB của tôi đã bị tiêu tốn". Hệ thống niềm tin này đã lỗi thời.
Eric Lippert

Câu trả lời:


69

Vim đôi khi gặp sự cố với các tệp có dòng dài bất thường. Đây là trình chỉnh sửa văn bản, do đó, nó được thiết kế cho các tệp văn bản, với độ dài dòng thường rộng tối đa vài trăm ký tự.

Một tệp cơ sở dữ liệu có thể không chứa nhiều ký tự dòng mới, vì vậy nó có thể hình dung là một dòng dài 100 Mb. Vim sẽ không hài lòng với điều đó, và mặc dù nó có thể sẽ hoạt động, nhưng có thể mất khá nhiều thời gian để tải tệp.

Tôi chắc chắn đã mở các tệp văn bản lớn hơn 100 Mb với Vim. Tệp thậm chí không cần phải vừa trong bộ nhớ cùng một lúc (vì Vim có thể hoán đổi các thay đổi sang đĩa khi cần).


1
Tôi cũng nhận thấy các dòng rất dài, đã thử với một tệp khác mà không có các dòng rất dài, thấy một sự cải thiện lớn. Cảm ơn
Hỏi và tìm hiểu

11
@AskandLearn Tùy thuộc vào loại tệp, bạn có thể thấy hiệu suất tăng nếu bạn set synmaxcol=120(hoặc một số số thích hợp khác). Tôi đã nhận thấy sự tăng tốc lớn từ điều này trong quá khứ.
sapi

Có ai biết nếu ngã ba neovim gần đây sẽ xử lý các dòng dài hơn tốt hơn? Tôi đoán đó không phải là vấn đề đặc biệt phổ biến ...
Hemmer

@GregHewgill là sự thật, tôi cũng đã quan sát điều đó, nhưng làm sao bạn biết điều đó?
Rahul Patil

56

Theo kinh nghiệm của tôi, Vim cuộn cảm không phải trên các tệp lớn , mà trên các dòng dài . Sử dụng lệnh này để mysqldumpsử dụng các dòng ngắn hơn với chi phí của một tệp lớn hơn :

$ mysqldump --complete-insert -u -p

Ngoài ra, bạn có thể mở Vim và yêu cầu nó không phân tích .vimrctệp của bạn hoặc tải bất kỳ plugin nào bằng lệnh này:

$ vim -u NONE output.sql

Tải Vim theo cách này sẽ sử dụng ít bộ nhớ hơn và không yêu cầu Vim phân tích toàn bộ tệp như nhiều plugin đã làm.


15

"Tải VIM mà không có .vimrc và plugin (VIM sạch), vd: cho các tệp HUGE

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

13

Hãy thử sử dụng lessthay vì vimnếu bạn muốn xem một tệp lớn trực tiếp. Vim cố gắng thực hiện nhiều công cụ khác nhau khi tải lần đầu tiên - quét tệp (có khả năng trong nhiều lần) để cố gắng xác định cú pháp nào sẽ sử dụng và thực hiện tô sáng cú pháp và tìm kiếm mô hình ở đầu và cuối tệp. Sau đó, khi bạn chỉnh sửa tệp, vim đang lưu các tệp hoán đổi và giữ các cây hoàn tác (hoàn tác lịch sử trong vim là phân nhánh, không phải tuyến tính như trong mọi (?) Trình chỉnh sửa khác) và liên tục đánh giá lại cú pháp tô sáng khi văn bản thay đổi, v.v.

Không có gì trong số đó nhất thiết là một lời biện minh cho lý do tại sao nó phải quá khó sử dụng với các tệp khổng lồ, nhưng đó là lời giải thích nhiều hơn về một số lý do tại sao nó lại như vậy.


Xem câu trả lời của tôi để biết cách ngăn VIM thực hiện các thao tác nặng như phân tích tệp.
dotancohen

Yup, tô sáng cú pháp trên những thứ như XML và SQL có thể rất chậm trên các tệp lớn hơn.
Marcin

9

Vim không chỉ tải tập tin như trong bộ nhớ. Nó chuyển đổi nó thành các cấu trúc bên trong (dòng, từ, v.v.), thực hiện đánh dấu cú pháp bằng ngôn ngữ script bên trong, v.v. tất cả đều tiêu thụ bộ nhớ (nhiều hơn một byte cho một ký tự) và thời gian CPU.


Bộ nhớ tiêu thụ thậm chí không phải là vấn đề. Thời gian CPU đã hết (và đóng băng có thể nhìn thấy trong khi bạn chờ), là.
Các cuộc đua nhẹ nhàng trong quỹ đạo

Thời gian CPU đó chủ yếu được chiếm bởi kịch bản tô sáng cú pháp.
demkoryu

Vâng tôi đồng ý. Tôi chỉ nói rằng việc sử dụng bộ nhớ rất khó xảy ra (a) là một vấn đề hoặc (b) gây ra sự chậm trễ lâu dài, trái với những gì câu trả lời của bạn nói.
Các cuộc đua nhẹ nhàng trong quỹ đạo

Bạn nói đúng, tôi đã cập nhật câu trả lời của mình cho phù hợp.
demkoryu


4

Hy vọng rằng vấn đề của bạn liên quan nhiều hơn đến VIM cần cho các tệp tạm thời (chẳng hạn như trao đổi) nhiều hơn RAM.

Trong nhiều trường hợp, các tệp tạm thời được tạo bởi VIM nằm trong cùng thư mục của tệp bạn đang mở. Nếu đây là trường hợp của bạn, thì bạn có thể xác minh bằng cách kiểm tra dung lượng đĩa trống trong thư mục hiện tại.

May mắn thay, có tài liệu tốt về cách bạn có thể chỉ định một vị trí khác cho các tệp lập chỉ mục / trao đổi của VIM:

Bạn cũng có thể vô hiệu hóa tập tin trao đổi


1

Thỉnh thoảng tôi mở các bản sao lưu cơ sở dữ liệu lớn ở định dạng văn bản .sql. Các tệp rất lớn hoặc các tệp có dòng rất dài đôi khi dường như mất nhiều thời gian để mở trong vim. Điều này có thể liên quan đến xử lý cú pháp và tô sáng màu, như được đề cập trong câu trả lời của @zzapper và @demonkoryu.

Một cách giải quyết nhanh có thể là nhấn "control-G" trong khi tải tệp để hủy cú pháp tô sáng trước khi xử lý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.