如何编辑千兆字节的文本文件?Vim无效=([关闭]


112

是否有任何编辑器可以编辑多个千兆字节的文本文件,也许只需一次将一小部分加载到内存中即可?Vim似乎不能处理它=(


我已经在vim中加载了非常大的数据采集文件,它可以毫无问题地处理它们。
Rook

根据您的编辑需求,您可能仅可以通过sed或perl之类的管道将其通过管道进行搜索和替换。
El Yobo 2010年

23
实际上,这并非没有题外之意,许多程序员使用vim,有时将其作为UI编辑器的补充。主题问题是关于实际问题的。我们都只知道有两种如此出色的瑞士军队工具可以完成此类任务,所以请不要将vim视作过于奇特或离场的工具。所以是为了人。
斯瓦沃米尔Lenart

而不是关闭它,为什么不将其移动到SuperUser或Linux / Unix或VIM?
user1271772

Answers:


72

如果你是在* nix(假设你要修改的文件只有部分(而很少)),你可以分割的文件(使用split命令),单独进行编辑(使用awksed或类似的东西)和之后,你将它们连接起来完成。

cat file2 file3 >> file1

10
大提示。我有一个13GB(152.000.000行)的sql文件,仅使用“ split -l 1000000”然后在我想用vim工作的地方编辑一百万行文件就很好了。花了10分钟只是为了分开它们。(我尝试用vim打开原始文件,并且可以正常工作,但是太慢了,无法使用。)
Claes Mogren

149

Ctrl-C将停止文件加载。如果文件足够小,您可能很幸运已经加载了所有内容,并杀死了所有后续加载步骤。使用此技巧时,请验证是否已加载整个文件。

Vim可以很好地处理大型文件。我刚刚编辑了一个3.4GB的文件,删除了行等。请记住三点:

  1. 按Ctrl-C:Vim会尝试首先读取整个文件,以执行诸如语法突出显示和文件中的行数之类的操作。Ctrl-C将取消此枚举(以及语法突出显示),并且只会加载需要在屏幕上显示。
  2. 只读:当文件太大而无法制作Vim时,Vim可能会开始只读。文件副本以执行编辑。我不得不 保存文件,这是花费最多的时间。
  3. 转到第1行:键入:115355将直接使您进入第115355行,对于大文件来说,这要快得多。Vim似乎在每次加载行缓冲区时都从头开始扫描,按住Ctrl-F来浏览文件似乎在文件末尾变得非常慢。

注–如果由于按Ctrl-C而使Vim实例处于只读状态,则Vim可能没有将整个文件加载到缓冲区中。如果发生这种情况,保存它只会保存缓冲区中的内容,而不是整个文件。您可能会迅速选择a G来跳到最后,以确保文件中的所有行都在那里。


14
使用此建议,可以在vim中处理44 GB的Wikipedia xml转储。(ctrl-c)。
vancan1ty

1
试图读取Windows上2.5GB日志文件的末尾。在gvim中打开时,如果分配的内存超过2GB,则会导致内存不足错误。尝试ctrl-c技巧时,它确实停止了将文件加载到内存中,但只允许查看gvim能够加载的文件部分。因此,在我按ctrl-c键之前等待的时间越长,可以看到的文件越多。无法导航到文件末尾或加载文件的其余部分(或者我不知道如何)。有点令人失望的是VIM没有达到任务:(最后我使用一些免费的专用工具将文件拆分为100MB的文件
slawek

14
对我不起作用。我加载了一个3GB的文件,按ctrl-c,然后显示内容。我可以编辑滚动等,但是当我到达已加载部分的末尾(假设是5%)时,它将不再加载(我一直停留在最初加载的文件部分,直到按ctrl-c为止)
Patryk

1
已确认,user3338098。如果按Ctrl-C并不会加载整个文件(就像其他人所讨论的那样),则保存它只会保存您已加载的内容。这可能就是为什么它首先变成只读的原因。我将更新“只读”点以注意这一点。
亚伦·R.

16
遵循这些指示使我破坏了我刚刚下载的巨大文件。您需要完全删除第2点,因为它基本上给出了导致数据丢失的说明,直到发布结束时才提到。
Neobyte

75

可能是导致它阻塞的插件。(语法突出显示,折叠等)

您可以在没有插件的情况下运行vim。

vim -u "NONE" hugefile.log

这是极简主义,但至少会为您提供惯用的振动效果。

syntax off

是另一个明显的例子。修剪您的安装并获取所需资源。您将了解它的功能以及是否需要通过其他方式完成任务。


3
这仍然将整个文件加载到RAM中...
Totor 2013年

@Totor是的,我会先分割文件,但是该设置将通过关闭随机自动命令迅速为您提供最佳的vim性能。那是我的意思。具有良好内存的工作站应该能够处理接近演出的文件。
迈克尔

2
所以当文件是虚拟内存大小的10倍时,vim / vi没用吗?
user3338098 2015年

1
我用此命令在2秒内打开了250MB的文件。令人惊叹
user674669 2015年

20

@Al pachio使用split + vim解决方案给出的答案略有改进,您可以使用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转储进行一些小的更改时,使用大约1 GB的文件。我在Windows上,这让我很痛苦。这是非常困难的。

显而易见的问题是“为什么需要?” 我可以从不得不多次尝试的经验中告诉您,您可能真的想尝试寻找另一种方法。

你是怎么做到的?我有几种方法可以做到。有时我可以通过vim或nano打开文件,并且可以使用它们。那是一个非常艰难的痛苦,但它确实有效。

如果这样不起作用(如您的情况),则只有几种选择。您可以编写一个小程序来进行所需的更改(例如,搜索和替换)。您可以使用可能能够执行的命令行程序(也许可以使用sed / awk / grep / etc来完成?)

如果这些方法不起作用,您总是可以将文件拆分为多个块(类似于拆分是显而易见的选择,但是您可以使用头/尾来获取所需的零件),然后编辑需要它的零件,稍后再组合。

不过请相信我,尝试寻找另一种方法。


3
在这种情况下,sed通常是您的朋友。您的编辑器真的不喜欢在文件顶部插入几个字符并弄清楚如何将其他所有内容压低的想法。
dkretz

@le dorfier:是的。我必须执行搜索/替换时使用了sed。当我不得不从这样的文件中删除几行(几行长行)时,我设法在vim中做到这一点,但是正如您可以猜测的那样,在行之间移动(以及实际删除)花费了相当多的时间。 (秒数以上即可回复并重新绘制)。我不想尝试在这些行之一中添加甚至几个字母。
MBCook 2009年

完全相同的问题。...大表或目标系统中不存在的文件组的SQL脚本顶部的“使用”语句。我使用Free File Splitter破坏它们,下面的命令行重新加入。
EBarr 2015年

6

我认为十六进制编辑器处理大文件是很常见的。在Windows上,我使用HxD,它声称可以处理高达8 EB(80亿千兆字节)的文件。


14
我很想知道他们是如何测试的...:P-
影子

在Linux上,我建议hexedit
elig

4

我正在使用Win7 x64上的vim 7.3.3和Charles CampbellLargeFile插件来处理多千兆字节的纯文本文件。它真的很好。

希望你说对了。


如何禁用该插件?例如,使所有其他扩展名(例如突出显示)在Vim中打开文件时又能正常工作?
hhh

3

哇,即使有1到2 GB,也从来没有设法使vim窒息。我听说,UltraEdit(在Windows上)和BBEdit(在Mac上)甚至更适合于更大的文件,但是我没有亲身经历。




2

我已经使用FAR Commander的内置编辑器/查看器来处理超大的日志文件。



1

我唯一能够用于类似操作的东西是我最喜欢的Mac十六进制编辑器0XED。但是,那是我认为很大的文件(几十兆字节)。我不确定会走多远。我很确定它只是一次将文件的一部分加载到内存中。


0

过去,当文件很大时,我已经成功使用了分割/编辑/合并方法。为此,您必须知道原始文件中待编辑文本的位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.