免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2904 | 回复: 17

[文本处理] 大文件处理的设计问题 [复制链接]

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
发表于 2015-03-13 22:51 |显示全部楼层
本帖最后由 tuyajie 于 2015-03-13 22:58 编辑

各位大神,想请教一个大文件处理的问题。我有一个20G的CSV文件,有400列左右。
我想做一些基本的数据质量检查操作,比如判断这列是小数还是整数还是字符串,如果是数字型,输出每一列的最大值,最小值,平均值,以及NULL的数量

我写了个基本的awk。但是性能很差。4个小时还是没有输出。
我能想到的基本的优化是切割文件,split或者cut。我目前在试验cut的效能。
想请教各位大神遇到这种问题有没有别的思路能把性能提高一些?语言可以不限制。当然shell最好。

  1. awk 'BEGIN{FS=",";OFS=",";getline}
  2. {for(i=3;i<=NF;i++){
  3.     if($i=="" ){$i=0;nullCnt[i]++};
  4.     if($i>=max[i])(max[i]=$i);
  5.     if($i<=min[i])(min[i]=$i);
  6.     sum[i]=sum[i]+$i}
  7. }
  8. END{for(i in max)print i,max[i],min[i],sum[i],nullCnt[i],NR}' inputFile> result
复制代码

论坛徽章:
0
发表于 2015-03-13 23:03 |显示全部楼层
对于大文件(100M以上),如需进行判断和运算,不建议使用SHELL,速度太慢了。
有一次我处理15G的文本,用SHELL花了3个多小时,后使用C进行处理,10多秒就出来了。

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
发表于 2015-03-13 23:51 |显示全部楼层
看来C还是非常重要的,性能之王啊 回复 2# lcz88990200


   

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
发表于 2015-03-14 00:28 |显示全部楼层
能分享下你的脚本么。我的C是入门中的入门回复 2# lcz88990200


   

论坛徽章:
0
发表于 2015-03-16 10:40 |显示全部楼层
本帖最后由 aswjh 于 2015-03-16 13:16 编辑

用go语言做了一个,不太熟,看看性能如何
用gccgo -g -o test test.go -O3比go的默认编译器要快30%

  1. package main

  2. import (
  3.     //"runtime"
  4.     "fmt"
  5.     "os"
  6.     "bufio"
  7.     "io"
  8.     "strings"
  9.     "strconv"
  10. )

  11. func run(fn string) {
  12.     fp, err := os.Open(fn)
  13.     defer fp.Close()
  14.     MAXCOL := 500
  15.     max := [500]int{}
  16.     min := [500]int{}
  17.     sum := [500]int{}
  18.     empty := [500]int{}
  19.     nr, colcnt := 0, 0
  20.     if err == nil {
  21.         buf := bufio.NewReader(fp)
  22.         bufio.NewReaderSize(buf, 6553600)
  23.         for {
  24.             data, _, err := buf.ReadLine()
  25.             if err != nil || err == io.EOF {
  26.                 break
  27.             }
  28.             nr++
  29.             if nr%1000000==0 {
  30.                 fmt.Println("处理到:", nr, "行")
  31.             }
  32.             cols := strings.Split(string(data), ",")
  33.             leng := len(cols)
  34.             for c := 3; c < leng; c++  {
  35.                 num, err := strconv.Atoi(cols[c])
  36.                 if c > colcnt {
  37.                     if err == nil {
  38.                         max[c], min[c], sum[c] = num, num, num
  39.                     } else {
  40.                         empty[c] = 1
  41.                     }
  42.                     colcnt = c
  43.                 } else {
  44.                     if err == nil {
  45.                         if num > max[c] {
  46.                             max[c] = num
  47.                         } else if num < min[c] {
  48.                             min[c] = num
  49.                         }
  50.                         sum[c] += num
  51.                     } else {
  52.                         min[c] = 0
  53.                         empty[c]++
  54.                     }
  55.                 }
  56.             }
  57.             for c := leng; c< MAXCOL; c++ {
  58.                 min[c] = 0
  59.                 empty[c]++
  60.             }
  61.         }
  62.         fmt.Println("处理结束.共", nr, "行")
  63.         for i, x := range sum {
  64.             if x > 0 || empty[i] < nr {
  65.                 fmt.Println(fmt.Sprintf("%d,%d,%d,%d,%d", i+1, max[i], min[i], x, empty[i]))
  66.             }
  67.         }
  68.     } else {
  69.         fmt.Print("打开文件出错:", fn)
  70.     }
  71. }

  72. func main() {
  73.     //runtime.GOMAXPROCS(5)
  74.     for _, f := range os.Args[1:] {
  75.         fmt.Println("正在处理:", f)
  76.         run(f)
  77.     }
  78. }

复制代码

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
发表于 2015-03-16 10:42 |显示全部楼层
我去试试,谢谢回复 5# aswjh


   

论坛徽章:
0
发表于 2015-03-16 10:52 |显示全部楼层
刚才的有点问题,改了一下

论坛徽章:
0
发表于 2015-08-24 17:17 |显示全部楼层
我有另外一个问题,大神tuyajie 能解答下吗? 谢谢!

http://bbs.chinaunix.net/forum.p ... ;page=1#pid24439571

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-08-25 15:59 |显示全部楼层
回复 1# tuyajie

能贴出 2, 3 行 看看么
你的csv
   

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2015-08-25 16:17 |显示全部楼层
既然是CSV,那excel来做吧,很快的。非常的基础
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP