当我有16 GB RAM时,为什么Vim无法打开100 MB文本文件?


67

我有一个100MB的MySQL数据库备份文件,但是在具有16G RAM的Linux机器上的Vim中无法打开它。

Vim只是挂起(至少不可用)。这是我不明白的事情。我有16 GB的RAM,为什么不能在编辑器中加载100 MB的文件?

是因为Vim吗?我以为所有内存管理都是由操作系统处理的。


3
考虑使用HEX编辑器而不是文本编辑器来查看此类文件。具有vi式界面的十六进制编辑器的示例为hexer
Ruslan 2014年

13
别忘了,数十年来内存不足时内存还没有耗尽。现在内存已虚拟化;它分为多个页面,这些页面可以交换到磁盘。从进程的地址空间分配的内存量与消耗的RAM量之间几乎没有关系。当内存不足时,地址空间(而不是RAM)也将耗尽。最好的考虑方式是内存是磁盘空间,每个进程都会获得一定数量的固定空间,而RAM是使磁盘速度更快的硬件
埃里克·利珀特

21
@EricLippert除了传统磁盘是如此之慢(与RAM相比)之外,它们仅适用于存储未处于活动使用状态的虚拟内存页面。 如果进程由于交换中断而挂起(或至少不可用,如OP所言),那恰恰是因为RAM耗尽了。
2014年

6
@EricLippert的地址空间用尽仅适用于当今的32位系统。我怀疑具有16G RAM的用户是否仍将使用32位PAE内核,而不是普通的64位1内核。
Ruslan 2014年

3
@depquid:很好。我评论的主旨是,OP似乎相信“我装载了100MB的东西,我有16000MB的RAM,因此我的16000MB的RAM中的100MB被消耗了”。这个信仰体系已经过时了。
埃里克·利珀特

Answers:


69

Vim有时会遇到行长过长的文件的问题。这是一个文本编辑器,因此它是为文本文件设计的,其行长通常最多为几百个字符。

数据库文件可能不包含许多换行符,因此可以想象它可能是一个100 Mb长的单行。Vim对此不满意,尽管可能会起作用,但加载文件可能需要很长时间。

我当然已经使用Vim 打开了远远大于100 Mb的文本文件。该文件甚至不需要一次全部放入内存中(因为Vim可以根据需要将更改交换到磁盘上)。


1
我还注意到很长的行,尝试使用另一个没有很长的行的文件,看到了很大的改进。谢谢
问和学习

11
@AskandLearn根据文件类型,如果您set synmaxcol=120(或其他一些适当的数字)可能会看到性能提高。过去,我注意到了这一点的巨大提速。
sapi 2014年

有谁知道最近的neovim前叉是否可以更好地处理更长的线条?我想这不是一个特别常见的问题...
Hemmer 2014年

@GregHewgill是的,我也注意到了,但是你怎么知道的?
拉胡尔·帕蒂尔

56

以我的经验,Vim不会在大文件上kes死,而是在长行中cho。使用此命令可以mysqldump使用较短的行,但会占用较大的文件

$ mysqldump --complete-insert -u -p

另外,您可以打开Vim并要求它不要解析该.vimrc文件或使用以下命令加载任何插件:

$ vim -u NONE output.sql

以这种方式加载Vim会占用更少的内存,并且不需要Vim像许多插件一样解析整个文件。


15

“加载没有.vimrc和插件(干净的VIM)的VIM,例如用于巨大的文件

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

13

如果不想直接查看大文件,请尝试使用less而不是vim。Vim首次加载时会尝试做很多不同的事情-扫描文件(可能是多次扫描),以确定要使用的语法,并突出显示语法,并在文件的顶部和底部搜索模式行。然后,在编辑文件时,vim将保存交换文件并保留撤消树(vim中的撤消历史是分支的,而不是像其他每个(?)编辑器一样线性),并随着文本的变化不断地重新评估突出显示的语法,等等。

所有这些都不一定是为什么它必须无法在巨型文件中使用的理由,而是更多地解释了为什么这样做的原因。


请参阅我的答案,以了解如何防止VIM执行繁重的操作,例如文件解析。
dotancohen 2014年

是的,在较大的文件上,诸如XML和SQL之类的语法突出显示会变得非常慢。
Marcin 2014年

9

Vim不仅将文件原样加载到内存中。它将其转换为内部结构(线条,单词等),使用内部脚本语言执行语法高亮显示,等等。所有这些都会消耗内存(每个字符要多于一个字节)和CPU时间。


消耗内存甚至不是问题。是占用的CPU时间(并且在等待期间出现明显的冻结)。
Lightness Races in Orbit

CPU时间主要由语法突出显示脚本占用。
demonkoryu

是的我同意。我只是说,内存使用不太可能(a)成为问题,或(b)导致长时间的延迟,这与您的回答相反。
Lightness Races in Orbit

您是对的,我已经相应更新了我的答案。
demonkoryu


4

希望您的问题更多与VIM有关临时文件(例如交换)的需求多于RAM。

在许多情况下,由VIM创建的临时文件与您打开的文件位于同一目录中。如果是这种情况,则可以通过检查当前目录中的可用磁盘空间来进行验证。

幸运的是,关于如何为VIM的索引/交换文件指定其他位置的文档很好:

您也可以禁用交换文件


1

我偶尔会打开.sql文本格式的大型数据库备份。在Vim中打开大文件或行很长的文件有时似乎需要很长时间。这可能与语法处理和颜色突出显示有关,如@zzapper和@demonkoryu的答案中所述。

一种快速的解决方法是在文件加载期间按“ control-G”以取消突出显示语法的预处理。

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.