让Vim在Windows上处理中等大小的文本文件?

Jon*_*nah 3 vim

我试图在Windows上的gvim中打开一个200MB的文本文件,这很令人窒息.vim窗口打开,只是保持空白且无响应.我的系统有8GB的RAM,使用记事本在大约2-5秒内打开文件.

我发现这篇关于在vim中编辑非常大的文本文件的帖子,我尝试在关闭插件的情况下打开文件:

vim -u "NONE" my200MBfile.text
Run Code Online (Sandbox Code Playgroud)

但这没有帮助.还有什么我可以做的才能让它发挥作用吗?看起来很奇怪vim会在我的机器上窒息什么不是真正的大文件.

谢谢!

seh*_*ehe 7

有可能它的语法插件,它VIM停止.我对Mbs-Gbs文件没有任何问题.除非我不小心打开了一些 - 不那么乖的 - 文件类型.

加载/挂起时按^ C(中断插件)

:syntax off
Run Code Online (Sandbox Code Playgroud)

诀窍.还有其他语法选项可以更轻松地处理文件,而无需完全"同步"语法突出显示


我更多地玩了这个,我发现我的一些插件确实会对(非常)大文件进行操作非常慢.为了好玩,我这样做了:

在一个大的输入文件(~600Mb):

$ wc input.txt.full 
  2674568   2674568 608825278 input.txt.full
Run Code Online (Sandbox Code Playgroud)

我通过以下调整启动了vim:

vim -u NONE -n +'se nonu nowrap ul=-1 | syn off' input.txt.full
Run Code Online (Sandbox Code Playgroud)

请注意这一点

  • -u NONE 防止执行初始化(用户)脚本和插件
  • -n 禁用swapfiles的写入(在慢/小磁盘上非常重要)
  • se nonu nowrap ul=-1 禁用

    • 行编号
    • 换行
    • 撤消历史记录(设置undolevels为负值)

    基本上,所有可能需要大量CPU或内存的东西

  • syn off 禁用语法高亮(如果语法高亮对文件类型有效,则应该有所不同)

现在,我想复制该行本身的每一行(全局:复制行,与之前的连接):

:g/^/t.|-j
Run Code Online (Sandbox Code Playgroud)

不幸的是,文件对于可用内存(~3Gb)1会变得太大,所以我选择在前20%(~535,000行)上执行操作:

:exec "norm 20%"|1,.g/^/t.|-j
Run Code Online (Sandbox Code Playgroud)

这工作在一个"jiffy",没有问题.手动导航(跳转,滚动,模式切换,搜索等)似乎是响应式的.

命令行基准:

$ xxd -c 44 /dev/urandom | head -n 3800000 >  input.txt.full 
$ wc input.txt.full 
  3800000  91820644 627000000 input.txt.full
$ time vim -u NONE -n +'se nonu nowrap ul=-1 | syn off' input.txt.full +'exec "norm 10%"|1,.g/^/t.|-j' +wq

real    0m7.778s
user    0m6.680s
sys 0m0.952s

$ wc input.txt.full 
  3800000 101002757 689940307 input.txt.full
Run Code Online (Sandbox Code Playgroud)

(注意689940307 ÷ 627000000 = 110.03 %,这是完全正确的).

这在我的书中并不慢.为了进行比较,wc调用本身 需要相同的时间(7.7s).


1执行所有测试tmpfs以避免缓存差异.


Dan*_*tch 5

问题更可能是vim不喜欢非常长的行.

首先尝试使用json_reformat文件中的工具...

如果您必须按原样编辑文件,请尝试:syntax off并可能:set nowrap在您遇到:edit相关文件之前.

  • 我试过在我的机器上制作一个类似的文件,如果它是JSON并不重要.当文件长度在10到20mb之间时,事情开始爬行,然后它们变得非常缓慢.我建议使用一些换行符重新格式化文档 - 即使你快速用`} \n`替换`}`来暂时查看和编辑它,它仍然是有效的JSON.`sed`会更快,但尝试使用powershell:`Get-Content json.txt | Foreach-Object {$ _ -replace"\}","} \`n"} | Set-Content json.txt` - vim在200mb文件上仍然会很慢,但它应该可用. (2认同)