我的应用场景是:并发的读取一个文件(或者一个超大的文件),计算文件的hash值,
就比如:文件60G,你的内存4G,如何计算?
这个例子是不是不太可能实现:

func main() {ffff, err := os.Open("./2.txt")if err != nil {fmt.Println("读取文件失败!")}defer ffff.Close()hash := md5.New()if _, err := io.Copy(hash, ffff); err != nil {log.Fatal(err)}sum := hash.Sum(nil)fmt.Printf("%x\n", sum)
}

这是平常的方法,对于超大文件是肯定不合适的

好了 ,直接上代码,这是我做的,可能有点小瑕疵,待解决,大神们也可直接指点迷津~~~


import ("bufio""bytes""crypto/md5""encoding/hex""fmt""io""log""os""sync""time"
)// 多线程读取大文件 计算hash值// 分片计算的结果
var dictResult sync.Map// 是否已经读取结束
var fileEnd chan struct{}// 并发控制
var dictThread chan struct{}// 文件路径
var filePath = "./2.txt"// 分片读取大小
var readSize = 20// 并发的线程数量
var threadNum = 3func main() {dictThread = make(chan struct{}, threadNum)fileEnd = make(chan struct{})for i := 0; ; i++ {t := idictThread <- struct{}{}go readFileByByte(filePath, t*readSize-1, i)select {case <-fileEnd:goto Nextdefault:}}
Next:time.Sleep(time.Second)ret := make([]string, 0)for i := 0; ; i++ {value, ok := dictResult.LoadAndDelete(i)if !ok {break}ret = append(ret, value.(string))}r := md5.Sum([]byte(buildString(ret...)))fmt.Println(hex.EncodeToString(r[:]))
}// 按字节读取文件: 文件路径,偏移量,第几片,
func readFileByByte(filePath string, set int, pageNum int) {f, err := os.Open(filePath)if err != nil {log.Fatal(err)return}if set == -1 {set = 0}_, err = f.Seek(int64(set), io.SeekStart)if err != nil {f.Close()fmt.Println(err.Error())fileEnd <- struct{}{} // 结束了return}var buf = make([]byte, 4096)reader := bufio.NewReader(f)n, err := reader.Read(buf)f.Close()<-dictThreadif err != nil && err != io.EOF || n == 0 {fileEnd <- struct{}{} // 结束了return}// md5 计算sum := md5.Sum(buf[:n])dictResult.Store(pageNum, hex.EncodeToString(sum[:]))fmt.Println(pageNum, "==>>", hex.EncodeToString(sum[:]))return
}
func buildString(pieces ...string) string {var strBuf bytes.Bufferfor _, piece := range pieces {strBuf.WriteString(piece)}return strBuf.String()
}

踩坑日志:go并发读取文件相关推荐

  1. 小程序踩坑日志(一)

    微信小程序踩坑日志 起步 申请账号 查看AppID-"设置"-开发设置 小程序的appid相当于小程序平台的一个身份验证 安装开发者工具https://mp.weixin.qq.c ...

  2. 数据挖掘实战(3)——时间序列预测ARIMA模型(附踩坑日志)

    文章目录 1 导包 2 数据准备 3 可视化 4 构建ARIMA模型 5 预测 6 踩坑日志 1 导包 import numpy as np import matplotlib.pyplot as p ...

  3. opensuse 装机踩坑日志

    前提:上次自己制作的centos服务器因为各种原因导致定时任务无法正常运转,另外centos自身的问题,想着趁着这次机会换一个稳如老狗的系统,从debian和opensuse中最终选择了opensus ...

  4. git踩坑——中途才使用.gitignore文件

    问题的产生 最近在学习java web项目,顺便使用git和码云gitee来托管代码,一开始没有创建.gitignore文件,导致上传到很多不必要的文件,如.idea和out文件(.idea文件是使用 ...

  5. 【Unity】对Unity引用三方字体的踩坑日志

    一.Unity导入三方字体 导入字体文件 要在项目中添加字体,必须将字体文件放在 Assets 文件夹中.然后,Unity 会自动将其导入.支持的字体格式为 TrueType 字体(.ttf 文件)和 ...

  6. 踩坑日志1----从zuulFilter到Filter

    踩坑缘起: 项目里面一直在线程的上下文里面放着一些用户的信息,之前测试的时候直接放在了接口的最前面,这次有时间把中间的逻辑终于捋清楚了,涉及到了SpringCloud的zuul以及filter,把这中 ...

  7. 为什么python不报错不出结果_python的坑货ConfigParser类读取文件失败不报错

    python中configparser模块(这个模块有个大坑)可以读取配置文件,当然这个配置文件的格式得按照这个模块指定的.格式如下 [CLICKHOUSE] ip = 172.20.96.78 us ...

  8. react开发公众号踩坑日志

    最近在用react开发一个公众号产品.以前没有过开发公众号的经验,在这里记录一下过程中踩过的坑. 这个项目是前后端开发的.本篇文章只站在前端的视角,希望给大家一个参考 一.授权回调 微信授权过程 进入 ...

  9. sideeffects没配置css也还在,webpack4踩坑配置之sideEffects, 打包文件中没有css文件

    最开始先来讲一下sideEffects sideEffects sideEffects意为副作用,无副作用类似纯函数的概念(接受参数并返回值,不产生其他影响) 这里的副作用针对模块,如果一个模块单纯的 ...

最新文章

  1. 洛谷P2286 [HNOI2004]宠物收养所 [STL,平衡树]
  2. Sensors Data:初创公司构建数据分析平台
  3. 小a与204(牛客寒假算法集训营1题目B)
  4. 在Android中使用GIF图片
  5. 在ASP.NET Core微服务架构下使用数据库切分和扩展, 并用JMeter进行负载测试
  6. 多C++标准版本指定
  7. (王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)
  8. linux 装nano命令,vim、nano在命令行上如何编辑文件
  9. use tool wget for windows download
  10. opencv-python 霍夫变换
  11. PAT简介和2019年秋季浙大PAT考试报名流程
  12. 6自由度机械臂建模与仿真
  13. 做图片用的计算机配置文件,电脑如何显示照片色域为DCI-P3标准的拍摄照片
  14. 关于人工智能的天马行空
  15. Vasya the Hipster - CodeForces - 581A
  16. 【Python语音分析】从绘制好看的波形图和语谱图开始
  17. 峰会•沙龙•招聘 | 记零数科技多线并进的一天
  18. 60创意的USB设备和小工具
  19. 包包的结构制图_原来可以用R这么画基因结构图
  20. 带时间轴的文章归档的html页面,WordPress纯CSS打造时间轴归档页面

热门文章

  1. Elasticsear使用文档
  2. 前端html的base64使用方法window.btoa()和window.atob()
  3. week10 day1 JavaScript
  4. Google浏览器简体中文版下载
  5. Crumb -面包屑状的嵌套按钮
  6. Latex 论文引用
  7. 《大国大城》读书笔记
  8. Android 自定义view完全解析--带你通透了解自定义view
  9. 第四章:前缀和、差分(数列)
  10. [强化学习一]隐马尔可夫基本概念