【问题标题】:Edit huge sql data file编辑庞大的sql数据文件
【发布时间】:2015-06-09 08:48:53
【问题描述】:

我有一个 23GB 的文件,我想编辑第 23 行,但我在服务器上只有 200 MB 可用 RAM。我不想完全打开文件,因为我只剩下 20GB 可用磁盘空间。

我该怎么做。我尝试使用 head,tail sed,但它似乎创建了一个临时文件。没有临时文件可以吗?

【问题讨论】:

  • 它从一个文件读取,写入另一个文件,然后删除原始文件(除非被指示保留备份)并将新文件重命名为旧名称。
  • 也许你可以从 here 改编这个技巧,就像在 sed '23s/foo/bar/' filename | dd of=filename conv=notrunc 中一样(如果结果文件更短,然后截断到新的长度)。 在将其用于实时数据之前对其进行测试。你有备份,对吧?对吧?!
  • 你租了一个虚拟机,把23GB的文件复制到里面,编辑,检查,删除原来的,然后把编辑好的文件复制回原来的位置。或者,您可以购买更多存储硬件。
  • @josifoski a quit 将停止输出 23 之后的行,因此,新文件最后只有 23 行,在这种情况下不是一个选项
  • 嗯...想一想,如果转换使文件变大,dd 技巧是否会改变工作方式?另一个想法:压缩文件,然后zcat通过sed,即gzip file; zcat file.gz | sed '23s/foo/bar/' > file。你可能有足够的空间放那个左边。

标签: linux sed


【解决方案1】:

解决方案是使用十六进制编辑器编辑文件。十六进制编辑器用于处理大文件,甚至是整个磁盘和分区。

您可能会发现hexedit(基于ncurses)或ghex(基于Gnome/Gtk)很有用。它们是常见的实用程序,因此您很可能会在您的发行版的存储库中找到它们。

我使用过的所有十六进制编辑器,使用双面板视图,左侧面板以十六进制显示文件的字节,右侧面板尽可能显示 Ascii 表示。

为了查找和编辑您的第 23 行:

sed -n '23p' my_huge_dump.sql :将打印此行的内容
sed -n '23p' my_huge_dump.sql | od -A n -t x1 :将以十六进制格式打印此行的内容。

或者用less -N my_huge_dump.sql打开文件,查看第23行的内容。(less中的-N启用行号)

现在,知道第 23 行的内容:

  • 如果此行的文本有些独特并且与周围的行不同,您可以从右侧 (ascii) 面板中找到它并使用箭头导航到此行。在hexedit 中,您使用Tab 键在Hex 和Ascii 面板之间移动。在 gHex 中,您也可以使用鼠标。您也可以搜索您感兴趣的字符串:移至 Ascii 面板并按 hexedit 中的 / 或使用 gHex 中的菜单。
  • 如果要编辑的行与其他行的内容相似,并且在 ascii 面板中找不到,则必须计算“换行符”分隔符才能找到第 23 行。新行 (LF) 以十六进制表示为 0A。在 ASCII 面板中,新行表示为点 .

然后假设您找到了要编辑的行,您有以下选择:

  • 希望第 23 行的新内容比现有内容的长度更短或相等(这样您就不需要扩大和移动整个文件)。在这种情况下,您必须输入Fill-mode,即在旧文本上覆盖现有内容输入的模式。这是gHexhexedit 中的默认模式。移动到您要编辑的位置并开始输入。按 Backspace 将撤消您的更改。如果新内容比现有内容短,您可以用空格填充该行以避免截断文件。
  • 如果此行中新内容比现有内容长,则必须进入Insert 模式。您可以使用 gHex 中的菜单来执行此操作。在hexedit 中,您必须使用 EscI 键绑定。然后开始输入,新字符将附加到当前位置。

在第一种情况下,可以保证文件的编辑和保存是即时的,因为会发生就地编辑。在后一种情况下,我不确定如何处理大小的增长和后续字节的移动,但我希望文件系统使用更大的非连续块来移动一些内容而不是移动整个文件。

如果您对更改感到满意,请保存文件:

  • 使用 gHex 中的菜单
  • hexedit 中使用Ctrlx 并在询问是否保存更改时回答(Y)es

始终确保您有备份!

编辑:我发现gHex 不适合您的情况,因为它会尝试将整个文件加载到内存中。 hexedit 将为您服务。但是,如果您想要像gHex 这样的图形编辑器,但具有部分文件加载功能,您可以尝试wxHexEditor。另请查看 Wikipedia 中的 Comparison of Hex editors 页面。

【讨论】:

    【解决方案2】:

    Liquid Studio 社区版包含一个Large File Editor,它可以在低规格机器上打开和编辑 Terra 字节文件,并且是免费的。

    复制文件需要足够的磁盘空间(写回文件时),但几乎不需要任何内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      相关资源
      最近更新 更多