【问题标题】:Working with huge files in VIM在 VIM 中处理大文件
【发布时间】:2010-12-08 04:23:15
【问题描述】:

我尝试在 VIM 中打开一个巨大的 (~2GB) 文件,但它卡住了。我实际上不需要编辑文件,只需高效地跳转即可。

如何在 VIM 中处理非常大的文件?

【问题讨论】:

  • 这里是a similar question
  • Vim 应该没问题,只要你先:set binary...
  • 这是一个新的 fuse 文件系统的好目标! splitfs 或类似的东西......我喜欢它!
  • 太晚了...这已经存在:sourceforge.net/projects/joinsplitfs
  • 您需要的是寻呼机,而不是编辑先生!请参阅下面吉姆的回答。

标签: vim large-files


【解决方案1】:

我今天有一个 12GB 的文件要编辑。 vim LargeFile 插件对我不起作用。它仍然用尽了我所有的内存,然后打印了一条错误消息:-(。我也不能使用 hexedit,因为它不能插入任何东西,只能覆盖。这是另一种方法:

您拆分文件,编辑各个部分,然后重新组合它。不过,您仍然需要两倍的磁盘空间。

  • Grep 查找您要编辑的行周围的内容:

    grep -n 'something' HUGEFILE | head -n 1
    
  • 提取文件的那个范围。假设您要编辑的行位于第 4 行和第 5 行。然后执行:

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
    
    • 需要 -n 选项来抑制 sed 打印所有内容的默认行为
    • 4,5p 打印第 4 行和第 5 行
    • 5q 在处理第 5 行后中止 sed
  • 使用您喜欢的编辑器编辑SMALLPART

  • 合并文件:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • 即:从 HUGEFILE 中选择已编辑行之前的所有行(在本例中为前 3 行),将其与已编辑行(在本例中为第 4 行和第 5 行)组合并使用这组组合行替换 HUGEFILE 中的等效项(在本例中为前 5 行)并将其全部写入新文件。

    HUGEFILE.new现在将成为您编辑的文件,您可以删除原始的HUGEFILE

【讨论】:

    【解决方案2】:

    这是多年来反复出现的问题。 (数字不断变化,但概念是一样的:如何查看或编辑大于内存的文件?)

    显然moreless 是仅读取文件的好方法——less 甚至提供vi 之类的用于滚动和搜索的键绑定。

    Freshmeat 搜索“大文件”表明有两个编辑器特别适合您的需求。

    一个是:lfhex ... 一个大文件十六进制编辑器(取决于 Qt)。显然,这需要使用 GUI。

    另一个似乎适合控制台使用:hed ... 它声称具有类似vim 的界面(包括ex 模式?)。

    我确信我见过其他 Linux/UNIX 编辑器能够在不将文件全部加载到内存的情况下对文件进行分页。但是,我不记得他们的任何名字。我将此回复设为“wiki”条目,以鼓励其他人将他们的链接添加到此类编辑器。 (是的,我熟悉使用splitcat 解决该问题的方法;但我正在考虑编辑器,尤其是控制台/诅咒编辑器,它们可以省去它并为我们节省时间/延迟和磁盘空间这种方法所需的开销)。

    【讨论】:

      【解决方案3】:

      由于您不需要实际编辑文件:

      1. view(或vim -R)应该可以很好地处理大文件。
      2. 或者您可以使用moreless

      【讨论】:

      • “扼流圈”是指需要一段时间才能打开?还是真的崩溃了?在我不太新的 Linux 机器上打开 view 中的 2.7GB 文件需要 4 多分钟(刚刚尝试并计时)。当然,这并不完全是即时的,但它确实有效。
      • 是的,它停了下来。我敢肯定,如果我等待它最终会打开。我少用了,因为它会立即打开,而且我已经习惯了导航。
      【解决方案4】:

      我根据 Florian 使用 nano(我最喜欢的编辑器)的回答编写了一个小脚本:

      #!/bin/sh
      
      if [ "$#" -ne 3 ]; then
        echo "Usage: $0 hugeFilePath startLine endLine" >&2
        exit 1
      fi
      
      sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
      nano hfnano_temporary_file
      (head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
      cat hfnano_temporary_file2 > $1
      rm hfnano_temporary_file hfnano_temporary_file2
      

      像这样使用它:

      sh hfnano yourHugeFile 3 8
      

      在该示例中,nano 将打开第 3 到 8 行,您可以对其进行编辑,当您保存并退出时,hugefile 中的这些行将自动被您保存的行覆盖。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,但它是一个 300GB 的 mysql 转储,我想摆脱 DROP 并将 CREATE TABLE 更改为 CREATE TABLE IF NOT EXISTS 所以不想运行 sed 的两次调用。我编写了这个快速的 Ruby 脚本来用这些更改来复制文件:

        #!/usr/bin/env ruby
        
        matchers={
            %q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
            %q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
        }
        
        matchers.each_pair { |m,r|
            STDERR.puts "%s: %s" % [ m, r ]
        }
        
        STDIN.each { |line|
            #STDERR.puts "line=#{line}"
            line.chomp!
            unless matchers.length == 0
                matchers.each_pair { |m,r|
                    re=/#{m}/
                    next if line[re].nil?
                    line.sub!(re,r)
                    STDERR.puts "Matched: #{m} -> #{r}"
                    matchers.delete(m)
                    break
                }
            end
            puts line
        }
        

        调用喜欢

        ./mreplace.rb < foo.sql > foo_two.sql
        

        【讨论】:

        • 运行需要注意,要作为exe运行,首先需要chmod +x mreplace.rb,也可以直接ruby mreplace.rb ..
        • 感谢@Steeve McCauley!不错的作品。正是我在寻找这个问题的答案时所寻找的。​​span>
        【解决方案6】:

        对于大型单行字(打印从199 的字符):

        cut -c 1-99 filename
        

        【讨论】:

          【解决方案7】:

          emacs 可以很好地处理 100 兆字节的文件,我在日志文件上使用它没有太多麻烦。

          但通常当我有某种分析任务时,我发现编写 perl 脚本是一个更好的选择。

          【讨论】:

            【解决方案8】:

            已经很晚了,但如果您只想浏览文件而不编辑它,cat 也可以完成这项工作。

            % cat filename | less
            

            或者简单的:

            % less filename
            

            【讨论】:

            • 请注意,catting 文件首先是非常愚蠢的,因为它要么意味着文件将完全在内存中(因此 less 可以查找文件),要么无法在全部; cat 只是给出静态输出流。
            【解决方案9】:

            旧线程。但是尽管如此(双关语:))。

             $less filename
            

            如果您不想编辑而只是环顾四周,检查大型日志文件时,less 可以有效地工作。

            在较少的作品中搜索,如 vi

            最好的部分,它在大多数发行版中默认可用。所以生产环境也不会有问题。

            【讨论】:

            • 在 650MB 文本文件中搜索 less 证明是 PITA。将 vim 与 LargeFile 一起使用就像一种魅力。
            • @MariusCC 那么你没有使用超过 2 GB 的文件,你的魅力会随着崩溃而消失!
            【解决方案10】:

            这是旧的,但是, 使用 nano、vim 或 gvim

            【讨论】:

            • 这些工具无法解决问题。
            • nano 填满了我的记忆,死在我身上。
            猜你喜欢
            • 2012-05-10
            • 2013-04-20
            • 2014-06-23
            • 2012-11-01
            • 1970-01-01
            • 2010-09-08
            • 1970-01-01
            • 2011-05-05
            • 2015-02-07
            相关资源
            最近更新 更多