IT人生

  • 首页
  • 归档
  • kafka
  • Java
  • Spring
  • Golang
  • SQL
  • Spark
  • ElasticSearch
  • 关于

  • 搜索
Phoenix HBase Kudu ElasticSearch Spring 数据结构 操作系统 Kettle Azkaban Sqoop Hive Yarn Redis Mybatis Impala Cloudera 大数据 HDFS mycat shell Linux 架构 并发 mysql sql golang java 工具 spark kafka 人生

在Linux中for和cat遍历文件内容出现no space

发表于 2016-11-08 | 分类于 Linux | 0 | 阅读次数 1249

以前使用for var in file方式逐行读取文件内容的时候,都没有出现问题,但是今天使用如下代码,会出现“no space” ,目标数据文件内容为6.8M,

# 写入临时文件,第一行不能写入
fillTempFile(){
  # 先删除临时文件,再创建
  rm -rf $fullTempFileName
  touch $fullTempFileName
  i=0
  for line in $(cat $targetFilePath$1)
  do   
      # 去掉第一行数据
      if [ $i -gt 0 ]
      then
          # 解析从第4位开始的数据,即为当前备注的数据行数
          echo $line >> $fullTempFileName
      fi
      # 遍历完一行之后,行号加1
      let i+=1
  done
}

造成这个问题的原因是:我使用的是AIX系统(/bin/ksh ksh88的栈系统很低效)。当使用for i in $targetFile的时候,系统会读取整个文件到栈系统中,造成当前系统内存溢出。

但是另外一个AIX系统的另外一个版本ksh93使用的是另外一种很高效的库,也就不会发生这个问题。其他一些shell,比如bash,在处理大数据量文件的时候更加高效。

但是ksh88是AIX系统的默认版本,系统工具、SMIT等都是使用ksh88。

解决这个问题的办法是避免使用冗余的方式,而是逐步加载,如下:

# 写入临时文件,第一行不能写入
fillTempFile(){
  # 先删除临时文件,再创建
  rm -rf $fullTempFileName
  touch $fullTempFileName
  i=0
  cat $targetFilePath$1 | while read line
  do   
      # 去掉第一行数据
      if [ $i -gt 0 ]
      then
          # 解析从第4位开始的数据,即为当前备注的数据行数
          echo "{$line}" >> $fullTempFileName
      fi
      # 遍历完一行之后,行号加1
      let i+=1
  done
}
  • 本文作者: Randy
  • 本文链接: http://www.itrensheng.com/archives/在Linux中for和cat遍历文件内容出现no space
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# Phoenix # HBase # Kudu # ElasticSearch # Spring # 数据结构 # 操作系统 # Kettle # Azkaban # Sqoop # Hive # Yarn # Redis # Mybatis # Impala # Cloudera # 大数据 # HDFS # mycat # shell # Linux # 架构 # 并发 # mysql # sql # golang # java # 工具 # spark # kafka # 人生
MySQL用户授权和bin-log日志
shell截取文件名称
  • 文章目录
  • 站点概览
Randy

Randy

技术可以暂时落后,但任何时候都要有上进的信念

80 日志
27 分类
31 标签
RSS
Github E-mail
Creative Commons
© 2021 备案号:沪ICP备19020689号-1
Randy的个人网站