vi查看大文件报错

1174阅读 1评论2012-01-09 我是月老
分类:

环境

产品: AIX
平台: 平台无关

问题

这种问题通常出现在编辑比较大的文件时,用户可以用vi打开文件,但是无法进行行编辑(比如替换某些字符串...),报错“out of memory”。

解答

这还是由于vi命令本身的buffer限制所引起的,从vi的man帮助中,我们可以看到:

vi 编辑器的限制
以下列表提供了 vi 编辑器的最大限制。这些计数采用单字节字符集。
.每行 {LINE_MAX} 个字符
.每个全局命令列表 256 个字符
.在以前被插入和删除的文本中 128 个字符
.在一个 shell 转义命令中 128 个字符
.在一个字符串值选项中 128 个字符
.在一个标记名中 30 个字符
.128 个映射宏,总共 2048 个字符
.1,048,560 行,每行不能超过 {LINE_MAX} 个字符的默认限制
.宏名和宏文本被限制在 100 个字符内。
注:对大于 64MB 的文件运行 vi 编辑器可能会显示以下的错误消息:
0602-103 file too large to place in /tmp

-yNumber 用任何大于 1024 的值覆盖 1,048,560 的最大行设置。由于 vi 编辑器使用额外的行进行缓冲区处理,请求的行数应该是需要的两倍。

要为所有编辑会话设置 vi 选项,将 :set 子命令置于 .profile 文件的 EXINIT 环境变量中(该文件由登录的 shell 读取)或将 set 子命令置于 .exrc 文件中。vi 编辑器首先查找 EXINIT 环境变量并运行其命令。如果 EXINIT 环境变量不存在,则 vi 编辑器查找 $HOME/.exrc 文件并运行其命令。最后,不管以前的结果如何,vi 编辑器查找本地 .exrc 文件并运行其命令。

我们可以尝试如下方法:
1) 运行"wc -l "以获得该文件的行数。
2) #vi -y(lines+1)*2
3) 如果仍然失败,我们则需要设置如下参数,然后再重新执行第二步。
export EXINIT='set dir=/largefilesystem'

当然,我们也可以将这些参数设置在$HOME/.exrc文件中:
#cd $HOME
#touch .exrc (如果文件不存在)
#chmod u+x .exrc
#vi .exrc
#set directory=/tmp
#set ll=(lines+1)*2
保存退出并执行vi。

上一篇:CRM虚拟机启动时报错
下一篇:进程查看与终止在CMD命令中的完美实现