Làm cách nào để chỉnh sửa tệp văn bản nhiều gigabyte? Vim không hoạt động = ([đã đóng]


112

Có trình chỉnh sửa nào có thể chỉnh sửa các tệp văn bản nhiều gigabyte, có lẽ bằng cách chỉ tải các phần nhỏ vào bộ nhớ cùng một lúc không? Có vẻ như Vim không thể xử lý được = (


Tôi đã tải các tệp thu thập dữ liệu thực sự lớn trong vim và nó đã xử lý chúng mà không có vấn đề gì.
Rook

Tùy thuộc vào nhu cầu chỉnh sửa của bạn, bạn có thể chỉ cần chuyển nó qua một cái gì đó như sed hoặc perl để thực hiện tìm kiếm và thay thế.
El Yobo

23
Thực ra nó không phải là lạc đề, nhiều lập trình viên sử dụng vim, đôi khi như một phần bổ sung cho trình chỉnh sửa giao diện người dùng. Câu hỏi chủ đề là về vấn đề thực tế. Tất cả chúng ta chỉ biết hai công cụ quân đội Thụy Sĩ tốt như vậy cho loại nhiệm vụ này, vì vậy xin vui lòng không coi vim là quá kỳ lạ hoặc lạc hậu. VẬY là dành cho con người.
Sławomir Lenart,

Thay vì đóng nó, tại sao không chuyển nó sang SuperUser hoặc Linux / Unix, hoặc VIM?
user1271772

Câu trả lời:


72

Nếu bạn đang ở trên * nix (và giả sử bạn phải thay đổi chỉ một phần của tập tin (và hiếm khi)), bạn có thể chia các tập tin (sử dụng splitlệnh), chỉnh sửa chúng riêng (sử dụng awk, sedhoặc một cái gì đó tương tự) và nối chúng sau khi bạn được thực hiện.

cat file2 file3 >> file1

10
Mẹo hay. Tôi đã có một tệp sql 13GB (152.000.000 dòng) và chỉ cần sử dụng "split -l 1000000", sau đó chỉnh sửa một triệu tệp dòng mà tôi muốn với vim đã hoạt động rất tốt. Mất 10 phút chỉ để chia chúng. (Tôi cố gắng để mở các tập tin ban đầu với vim và làm việc, nhưng nó đã quá chậm để có thể sử dụng.)
Claes Mogren

149

Ctrl-C sẽ dừng tải tệp. Nếu tệp đủ nhỏ, bạn có thể may mắn đã tải tất cả nội dung và chỉ cần bỏ qua bất kỳ bước tải bài đăng nào. Xác minh rằng toàn bộ tệp đã được tải khi sử dụng mẹo này.

Vim có thể xử lý các tệp lớn khá tốt. Tôi vừa chỉnh sửa một tệp 3,4 GB, đang xóa các dòng, v.v. Ba điều cần lưu ý:

  1. Nhấn Ctrl-C: Vim cố gắng đọc toàn bộ tệp ban đầu, để thực hiện những việc như đánh dấu cú pháp và số dòng trong tệp, v.v. Ctrl-C sẽ hủy kiểu liệt kê này (và đánh dấu cú pháp) và nó sẽ chỉ tải những gì. cần thiết để hiển thị trên màn hình của bạn.
  2. Chỉ đọc: Vim có thể sẽ bắt đầu chỉ đọc khi tệp quá lớn khiến nó không thể thực hiện. bản sao tệp để thực hiện các chỉnh sửa. Tôi đã phải w! để lưu tệp và đó là lúc mất nhiều thời gian nhất.
  3. Chuyển đến dòng: Việc nhập :115355sẽ đưa bạn trực tiếp đến dòng 115355, nhanh hơn nhiều trong các tệp lớn đó. Vim dường như bắt đầu quét từ đầu mỗi khi nó tải bộ đệm các dòng và nhấn giữ Ctrl-F để quét qua tệp dường như thực sự chậm ở gần cuối.

Lưu ý - Nếu phiên bản Vim của bạn ở chế độ chỉ đọc vì bạn nhấn Ctrl-C, có thể Vim đã không tải toàn bộ tệp vào bộ đệm. Nếu điều đó xảy ra, việc lưu nó sẽ chỉ lưu những gì có trong bộ đệm chứ không phải toàn bộ tệp . Bạn có thể nhanh chóng kiểm tra bằng cách Gbỏ qua đến cuối để đảm bảo tất cả các dòng trong tệp của bạn đều ở đó.


14
Đã có thể đối phó với 44 gigabyte wikipedia xml kết xuất trong vim bằng cách sử dụng lời khuyên này. (ctrl-c).
vancan1ty

1
Đã cố gắng đọc phần cuối của tệp nhật ký 2,5GB trên windows. Mở trong gvim dẫn đến lỗi hết bộ nhớ khi bộ nhớ được cấp phát vượt quá 2GB. Khi thử ctrl-c trick, nó đã ngừng tải tệp vào bộ nhớ nhưng chỉ cho phép xem phần tệp mà gvim có thể tải. Vì vậy, tôi càng đợi lâu trước khi nhấn ctrl-c thì tôi càng có thể thấy nhiều tệp hơn. Không thể điều hướng đến cuối tệp hoặc tải phần còn lại của tệp (hoặc tôi không biết làm thế nào). Kinda thất vọng rằng vim là không lên đến nhiệm vụ:. (Cuối cùng tôi đã sử dụng một số công cụ chuyên dụng miễn phí để phân chia các tập tin vào 100MB file
slawek

14
Không hiệu quả với tôi. Tôi tải một tệp 3GB, nhấn ctrl-c và sau đó nội dung hiển thị. Tôi có thể chỉnh sửa cuộn, v.v. nhưng khi tôi đến cuối phần đã tải (giả sử 5%), nó sẽ không tải nữa (tôi bị mắc kẹt với phần tệp được tải ban đầu cho đến thời điểm tôi nhấn ctrl-c)
Patryk

1
Đã xác nhận, người dùng3338098. Nếu bạn nhấn Ctrl-C và nó không tải toàn bộ tệp (như những người khác đã nói về), việc lưu nó chỉ lưu những gì bạn đã tải. Đó có lẽ là lý do tại sao nó chỉ được đọc ngay từ đầu. Tôi sẽ cập nhật điểm Readonly của mình để lưu ý điều đó.
Aaron R.

16
Làm theo các hướng dẫn này đã khiến tôi hủy một tệp lớn mà tôi vừa tải xuống. Bạn cần loại bỏ hoàn toàn điểm 2 vì về cơ bản nó đưa ra các hướng dẫn gây mất dữ liệu mà bạn không đề cập đến cho đến cuối bài.
Neobyte

75

Nó có thể là các plugin đang khiến nó bị nghẹt. (đánh dấu cú pháp, nếp gấp, v.v.)

Bạn có thể chạy vim mà không cần plugin.

vim -u "NONE" hugefile.log

Nó tối giản nhưng ít nhất nó sẽ cung cấp cho bạn những chuyển động vi tính mà bạn đã quen.

syntax off

là một điều hiển nhiên khác. Cắt tỉa cài đặt của bạn và tìm nguồn những gì bạn cần. Bạn sẽ tìm ra khả năng của nó và liệu bạn có cần hoàn thành nhiệm vụ thông qua các phương tiện khác hay không.


3
Đây vẫn tải toàn bộ file trong RAM ...
Totor

@Totor vâng, tôi sẽ chia nhỏ tệp trước nhưng cài đặt đó sẽ nhanh chóng mang lại cho bạn hiệu suất vim tốt nhất bằng cách tắt các lệnh tự động ngẫu nhiên. Đó là quan điểm của tôi. Các máy trạm có bộ nhớ tốt sẽ có thể xử lý các tệp sắp đạt được một hợp đồng biểu diễn.
michael

2
vì vậy vim / vi là vô dụng khi tệp có kích thước gấp 10 lần bộ nhớ ảo?
user3338098

1
Tôi đã sử dụng lệnh này để mở tệp 250MB trong vòng chưa đầy 2 giây. Tuyệt vời
dùng674669

20

Một chút cải tiến đối với câu trả lời do @Al pachio đưa ra với giải pháp split + vim, bạn có thể đọc các tệp trong đó với một khối cầu, sử dụng hiệu quả các khối tệp làm bộ đệm, ví dụ:

$ 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

15

Bạn có thể muốn xem plugin VIM này vô hiệu hóa một số tính năng vim vì lợi ích của tốc độ khi tải các tệp lớn.


8

Tôi đã cố gắng làm điều đó, chủ yếu với các tệp khoảng 1 GB khi tôi cần thực hiện một số thay đổi nhỏ đối với kết xuất SQL. Tôi đang sử dụng Windows, điều này khiến nó trở thành một vấn đề lớn. Nó rất khó.

Câu hỏi rõ ràng là "tại sao bạn cần?" Tôi có thể nói với bạn từ kinh nghiệm phải thử điều này nhiều hơn một lần, bạn có thể thực sự muốn thử tìm cách khác.

vậy bạn sẽ làm sao? Có một số cách tôi đã thực hiện. Đôi khi tôi có thể nhận vim hoặc nano để mở tệp và tôi có thể sử dụng chúng. Đó là một nỗi đau thực sự khó khăn, nhưng nó có hiệu quả.

Khi điều đó không hiệu quả (như trong trường hợp của bạn), bạn chỉ có một số lựa chọn. Bạn có thể viết một chương trình nhỏ để thực hiện các thay đổi bạn cần (ví dụ: tìm kiếm và thay thế). Bạn có thể sử dụng một chương trình dòng lệnh có thể thực hiện được (có thể nó có thể được thực hiện với sed / awk / grep / etc?)

Nếu những cách đó không hiệu quả, bạn luôn có thể chia tệp thành nhiều phần (chẳng hạn như chia nhỏ là lựa chọn hiển nhiên, nhưng bạn có thể sử dụng head / tail để có được phần bạn muốn) và sau đó chỉnh sửa (các) phần cần nó, và kết hợp lại sau đó.

Hãy tin tôi, hãy thử tìm cách khác.


3
Thông thường sed là bạn của bạn trong những trường hợp như thế này. Người chỉnh sửa của bạn thực sự không thích ý nghĩ chèn một vài ký tự ở đầu tệp và tìm cách đẩy mọi thứ khác xuống.
dkretz

@le dorfier: Đúng vậy. Tôi đã sử dụng sed khi tôi phải thực hiện tìm kiếm / thay thế. Khi tôi phải xóa một vài dòng khỏi một tệp như vậy (một vài dòng cực kỳ dài ), tôi đã cố gắng làm điều đó trong vim, nhưng như bạn có thể đoán việc di chuyển giữa các dòng (cũng như xóa thực tế) mất khá nhiều thời gian (giây + để phản hồi và vẽ lại). Tôi sẽ không muốn cố gắng thêm dù chỉ một vài chữ cái vào một trong những dòng đó.
MBCook

Chính xác cùng một vấn đề .... câu lệnh "using" ở đầu tập lệnh SQL cho một bảng lớn hoặc một nhóm tệp không tồn tại trong hệ thống đích. Tôi sử dụng Free File Splitter để phá chúng, dòng lệnh bên dưới để tham gia lại.
EBarr

6

Tôi nghĩ rằng việc các trình chỉnh sửa hex xử lý các tệp lớn là điều hợp lý. Trên Windows, tôi sử dụng HxD , công cụ này tuyên bố xử lý các tệp lên đến 8 EB (8 tỷ gigabyte).


14
Tôi muốn biết họ đã kiểm tra điều đó như thế nào ...: P
Shadow

Trên linux tôi khuyên bạn nênhexedit
elig

4

Tôi đang sử dụng vim 7.3.3 trên Win7 x64 với plugin LargeFile của Charles Campbell để xử lý các tệp văn bản thuần túy nhiều gigabyte. Nó hoạt động thực sự tốt.

Tôi hy vọng bạn đến đúng.


Làm cách nào bạn có thể vô hiệu hóa plugin? Ví dụ: làm cho tất cả các phần mở rộng khác như đánh dấu hoạt động trở lại khi một tệp được mở trong Vim?
hhh

3

Chà, không bao giờ quản lý để khiến khí lực bị nghẹt thở, ngay cả với một hoặc hai GB. Tôi đã nghe nói rằng UltraEdit (trên Windows) và BBEdit (trên Mac) thậm chí còn phù hợp hơn với các tệp lớn hơn nữa, nhưng tôi không có kinh nghiệm cá nhân.




2

Tôi đã sử dụng trình chỉnh sửa / trình xem tích hợp của FAR Commander cho các tệp nhật ký siêu lớn.



1

Điều duy nhất tôi có thể sử dụng cho những thứ như vậy là trình chỉnh sửa Mac hex yêu thích của tôi, 0XED. Tuy nhiên, đó là với các tệp mà tôi coi là lớn ở hàng chục megabyte. Tôi không chắc nó sẽ đi bao xa. Tuy nhiên, tôi khá chắc chắn rằng nó chỉ tải các phần của tệp vào bộ nhớ cùng một lúc.


0

Trước đây, tôi đã sử dụng thành công cách tiếp cận tách / chỉnh sửa / nối khi các tệp rất lớn. Để làm việc này, bạn phải biết vị trí của văn bản cần chỉnh sửa, trong tệp gốc.

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.