Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77635
  • 博文数量: 30
  • 博客积分: 113
  • 博客等级: 民兵
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-02 00:37
文章分类
文章存档

2012年(20)

2011年(10)

我的朋友

分类:

2012-01-09 20:25:21

原文地址:vi查看大文件报错 作者:w200916-gmail

环境

产品: 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。

阅读(1084) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~