婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang 實現超大文件讀取的兩種方法

Golang 實現超大文件讀取的兩種方法

熱門標簽:阿克蘇地圖標注 外呼系統用什么卡 excel地圖標注分布數據 評價高的400電話辦理 壽光微信地圖標注 電話機器人軟件免費 百度地圖標注后傳給手機 外呼系統顯本地手機號 涿州代理外呼系統

Golang超大文件讀取的兩個方案

流處理方式

分片處理

去年的面試中我被問到超大文件你怎么處理,這個問題確實當時沒多想,回來之后仔細研究和討論了下這個問題,對大文件讀取做了一個分析

比如我們有一個log文件,運行了幾年,有100G之大。按照我們之前的操作可能代碼會這樣寫:

func ReadFile(filePath string) []byte{
    content, err := ioutil.ReadFile(filePath)
    if err != nil {
        log.Println("Read error")
    }
    return content
} 

上面的代碼讀取幾兆的文件可以,但是如果大于你本身及其內存,那就直接翻車了。因為上面的代碼,是把文件所有的內容全部都讀取到內存之后返回,幾兆的文件,你內存夠大可以處理,但是一旦上幾百兆的文件,就沒那么好處理了。

那么,正確的方法有兩種

第一個是使用流處理方式代碼如下

func ReadFile(filePath string, handle func(string)) error {
    f, err := os.Open(filePath)
    defer f.Close()
    if err != nil {
        return err
    }
    buf := bufio.NewReader(f)
 
    for {
        line, err := buf.ReadLine("\n")
        line = strings.TrimSpace(line)
        handle(line)
        if err != nil {
            if err == io.EOF{
                return nil
            }
            return err
        }
        return nil
    }
}

第二個方案就是分片處理

當讀取的是二進制文件,沒有換行符的時候,使用下面的方案一樣處理大文件

func ReadBigFile(fileName string, handle func([]byte)) error {
    f, err := os.Open(fileName)
    if err != nil {
        fmt.Println("can't opened this file")
        return err
    }
    defer f.Close()
    s := make([]byte, 4096)
    for {
        switch nr, err := f.Read(s[:]); true {
        case nr  0:
            fmt.Fprintf(os.Stderr, "cat: error reading: %s\n

補充:golang 讀取大文件處理sync.pool + bufio.NewReader(f)

看代碼吧~

文件大小

package main
import (
	"bufio"
	"fmt"
	"io"
	//"math"
	"os"
	"strings"
	"sync"
	"time"
)
func main() {
	/*
	文件數據樣例
	{"remark": "來電時間:  2021/04/15 13:52:07客戶電話:13913xx39xx ", "no": "600020510132021101310210547639", "title": "b-ae0e-0242ac100907", "call_in_date": "2021-04-15 13:52:12", "name": "張三", "_date": "2021-06-15", "name": "張三", "meet": "1"}
	1、我們取出 call_in_date": "2021-04-15 13:52:1的數據寫入另一個文件
	*/
	var (
		s time.Time //當前時間
		file *os.File
		fileStat os.FileInfo
		err error
		lastLineSize int64
	)
	s = time.Now()
	if file, err = os.Open("/Users/zhangsan/Downloads/log.txt");err != nil{
		fmt.Println(err)
	}
	defer func() {
		err = file.Close() //close after checking err
	}()
	//queryStartTime, err := time.Parse("2006-01-02T15:04:05.0000Z", startTimeArg)
	//if err != nil {
	//	fmt.Println("Could not able to parse the start time", startTimeArg)
	//	return
	//}
	//
	//queryFinishTime, err := time.Parse("2006-01-02T15:04:05.0000Z", finishTimeArg)
	//if err != nil {
	//	fmt.Println("Could not able to parse the finish time", finishTimeArg)
	//	return
	//}
	/**
	* {name:"log.log", size:911100961, mode:0x1a4,
	modTime:time.Time{wall:0x656c25c, ext:63742660691,
	loc:(*time.Location)(0x1192c80)}, sys:syscall.Stat_t{Dev:16777220,
	Mode:0x81a4, Nlink:0x1, Ino:0x118cba7, Uid:0x1f5, Gid:0x14, Rdev:0,
	Pad_cgo_0:[4]uint8{0x0, 0x0, 0x0, 0x0}, Atimespec:syscall.Timespec{Sec:1607063899, Nsec:977970393},
	Mtimespec:syscall.Timespec{Sec:1607063891, Nsec:106349148}, Ctimespec:syscall.Timespec{Sec:1607063891,
	Nsec:258847043}, Birthtimespec:syscall.Timespec{Sec:1607063883, Nsec:425808150},
	Size:911100961, Blocks:1784104, Blksize:4096, Flags:0x0, Gen:0x0, Lspare:0, Qspare:[2]int64{0, 0}}
	*
	*/
	if fileStat, err = file.Stat();err != nil {
		return
	}
	fileSize := fileStat.Size()//72849354767
	offset := fileSize - 1
	//檢測是不是都是空行 只有\n
	for {
		var (
			b []byte
			n int
			char string
		)
		b = make([]byte, 1)
		//從指定位置讀取
		if n, err = file.ReadAt(b, offset);err != nil {
			fmt.Println("Error reading file ", err)
			break
		}
		char = string(b[0])
		if char == "\n" {
			break
		}
		offset--
		//獲取一行的大小
		lastLineSize += int64(n)
	}
	var (
		lastLine []byte
		logSlice []string
		logSlice1 []string
	)
	//初始化一行大小的空間
	lastLine = make([]byte, lastLineSize)
	_, err = file.ReadAt(lastLine, offset)
	if err != nil {
		fmt.Println("Could not able to read last line with offset", offset, "and lastline size", lastLineSize)
		return
	}
	//根據條件進行區分
	logSlice = strings.Split(strings.Trim(string(lastLine),"\n"),"next_pay_date")
	logSlice1  = strings.Split(logSlice[1],"\"")
	if logSlice1[2] == "2021-06-15"{
		Process(file)
	}
	fmt.Println("\nTime taken - ", time.Since(s))
		fmt.Println(err)
}
func Process(f *os.File) error {
	//讀取數據的key,減小gc壓力
	linesPool := sync.Pool{New: func() interface{} {
		lines := make([]byte, 250*1024)
		return lines
	}}
	//讀取回來的數據池
	stringPool := sync.Pool{New: func() interface{} {
		lines := ""
		return lines
	}}
	//一個文件對象本身是實現了io.Reader的 使用bufio.NewReader去初始化一個Reader對象,存在buffer中的,讀取一次就會被清空
	r := bufio.NewReader(f) //
	//設置讀取緩沖池大小 默認16
	r = bufio.NewReaderSize(r,250 *1024)
	var wg sync.WaitGroup
	for {
		buf := linesPool.Get().([]byte)
		//讀取Reader對象中的內容到[]byte類型的buf中
		n, err := r.Read(buf)
		buf = buf[:n]
		if n == 0 {
			if err != nil {
				fmt.Println(err)
				break
			}
			if err == io.EOF {
				break
			}
			return err
		}
		//補齊剩下沒滿足的剩余
		nextUntillNewline, err := r.ReadBytes('\n')
		//fmt.Println(string(nextUntillNewline))
		if err != io.EOF {
			buf = append(buf, nextUntillNewline...)
		}
		wg.Add(1)
		go func() {
			ProcessChunk(buf, linesPool, stringPool)
			wg.Done()
		}()
	}
	wg.Wait()
	return nil
}
func ProcessChunk(chunk []byte, linesPool *sync.Pool,stringPool *sync.Pool) {
//做相應的處理
}

執行

go run test2.go "2020-01-01T00:00:00.0000Z" "2020-02-02T00:00:00.0000Z" /Users/zhangsan/go/src/workspace/test/log.log
EOF
Time taken -  20.023517675s
nil>

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang文件讀取-按指定BUFF大小讀取方式
  • golang逐行讀取文件的操作
  • Golang 實現分片讀取http超大文件流和并發控制
  • 淺談Golang是如何讀取文件內容的(7種)
  • golang 使用 viper 讀取自定義配置文件
  • 如何利用Golang解析讀取Mysql備份文件
  • golang讀取文件的常用方法總結

標簽:重慶 吐魯番 梅河口 銅川 雞西 汕頭 欽州 蘭州

巨人網絡通訊聲明:本文標題《Golang 實現超大文件讀取的兩種方法》,本文關鍵詞  Golang,實現,超大,文件,讀,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang 實現超大文件讀取的兩種方法》相關的同類信息!
  • 本頁收集關于Golang 實現超大文件讀取的兩種方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产98色在线|日韩| 日韩和欧美一区二区| 中文字幕欧美三区| 蜜桃一区二区三区在线| 色一区在线观看| 国产午夜精品一区二区三区视频 | 亚洲成人免费av| 成人av在线电影| 久久精品一区二区三区四区| 加勒比av一区二区| 欧美一区二区三区四区高清| 91精品国产色综合久久| 免费看欧美美女黄的网站| 欧美日韩一区久久| 亚洲成人精品影院| 欧美精品在欧美一区二区少妇| 午夜精品久久久久久久久久| 欧美日产在线观看| 蜜臀va亚洲va欧美va天堂| 日韩欧美电影一区| 国内精品第一页| 国产精品无遮挡| 一本久久精品一区二区| 亚洲精选视频在线| 欧美日韩一区三区四区| 九色综合国产一区二区三区| 欧美极品美女视频| 在线视频一区二区免费| 免费一级片91| 国产免费久久精品| 欧美性猛片xxxx免费看久爱| 老司机午夜精品99久久| 国产欧美va欧美不卡在线| 91在线视频播放地址| 亚洲一区二区三区在线| 欧美一二区视频| 成人免费视频免费观看| 亚洲一级二级在线| 久久品道一品道久久精品| av成人免费在线观看| 亚洲一区二区美女| 精品粉嫩超白一线天av| 91免费版pro下载短视频| 秋霞影院一区二区| 国产亚洲欧美日韩日本| 欧洲一区在线观看| 国产69精品一区二区亚洲孕妇| 亚洲国产欧美另类丝袜| www激情久久| av影院午夜一区| 日韩黄色在线观看| 国产偷国产偷精品高清尤物| 欧美亚洲国产一区二区三区| 国产乱对白刺激视频不卡| 亚洲黄色片在线观看| 91麻豆精品国产自产在线观看一区 | 色综合色狠狠综合色| 久久激情综合网| 亚洲夂夂婷婷色拍ww47| 久久久精品2019中文字幕之3| 欧美久久免费观看| www.欧美日韩国产在线| 国产美女在线精品| 日韩成人一区二区三区在线观看| 国产精品三级在线观看| 精品久久人人做人人爽| 91精品国产色综合久久久蜜香臀| 色综合久久久久| 91免费版pro下载短视频| 欧美成人精品福利| 在线观看亚洲a| av爱爱亚洲一区| 国产精品一区二区黑丝| 久久精品国产久精国产| 亚洲h动漫在线| 亚洲欧美电影院| 国产精品国产馆在线真实露脸 | 日韩一区二区三区免费观看| 在线观看视频一区| 色婷婷精品大在线视频| 色琪琪一区二区三区亚洲区| 91福利在线看| 欧美日本精品一区二区三区| 欧美午夜精品电影| 欧美三级中文字幕在线观看| 欧美视频一区二区三区| 日韩欧美中文字幕制服| 精品国产一区二区三区不卡| 91精品久久久久久久99蜜桃| 欧美大胆人体bbbb| 久久婷婷成人综合色| 国产精品久久久久桃色tv| 亚洲激情图片一区| 免费观看在线综合| 国产高清视频一区| 在线视频欧美精品| 欧美大片日本大片免费观看| 国产精品美日韩| 香蕉影视欧美成人| 国内精品久久久久影院薰衣草| 大尺度一区二区| 欧美日韩性生活| 亚洲国产电影在线观看| 亚洲大尺度视频在线观看| 国产一区二区三区黄视频| 97久久精品人人做人人爽| 欧美剧在线免费观看网站 | 欧美日韩国产系列| 国产亚洲一二三区| 亚洲成人你懂的| 成人av影视在线观看| 欧美一区二区三区电影| 中文字幕日韩一区| 蜜臀av一区二区在线免费观看| youjizz国产精品| 精品国产一区二区亚洲人成毛片| 亚洲精品国产a| 国产91高潮流白浆在线麻豆| 在线综合视频播放| 亚洲视频香蕉人妖| 久久99国产乱子伦精品免费| 一本高清dvd不卡在线观看| 国产午夜精品一区二区三区视频| 亚洲三级在线免费| 国产91精品一区二区麻豆网站| 制服丝袜av成人在线看| 亚洲精品一卡二卡| 国产成人综合视频| 欧美私模裸体表演在线观看| 久久精品欧美日韩精品| 亚洲福利一区二区三区| 久久精品国产秦先生| 欧美三级乱人伦电影| 久久精品欧美一区二区三区麻豆| 亚洲欧洲www| 欧美性色黄大片| 国产精品人成在线观看免费| 国精品**一区二区三区在线蜜桃| 日韩电影在线观看电影| 欧美剧情电影在线观看完整版免费励志电影 | 欧美日韩免费电影| 亚洲女性喷水在线观看一区| 亚洲精品国产精华液| 91麻豆免费观看| 成av人片一区二区| 国产精品盗摄一区二区三区| 色综合久久综合中文综合网| 日韩理论片网站| 91首页免费视频| 在线免费亚洲电影| 中文字幕欧美三区| 亚洲欧洲精品成人久久奇米网| 国产91精品露脸国语对白| 99视频精品在线| 亚洲免费在线观看| 日本不卡一区二区三区高清视频| 欧美美女喷水视频| 99久久99久久精品免费看蜜桃| 1000部国产精品成人观看| 一本久道中文字幕精品亚洲嫩| 亚洲综合成人网| 欧美视频一区二区三区四区| 欧美美女一区二区| 国产在线一区二区综合免费视频| 国产女主播视频一区二区| 亚洲成人免费av| 国产成人精品三级| 欧美片在线播放| 处破女av一区二区| 色综合中文综合网| 日韩视频在线你懂得| 欧美一区二区视频网站| 国产乱色国产精品免费视频| 99久久婷婷国产综合精品电影 | 久久亚洲二区三区| 成人免费在线播放视频| 欧美精品99久久久**| av中文字幕一区| 亚洲制服欧美中文字幕中文字幕| 欧美色网站导航| 国产日韩欧美不卡在线| 色综合久久中文综合久久97| 精品国产免费一区二区三区四区| 91麻豆国产福利精品| 欧美大片一区二区三区| 成人免费黄色在线| 日精品一区二区| 91福利在线观看| 国产激情一区二区三区四区 | 亚洲色欲色欲www在线观看| 免费国产亚洲视频| 中文字幕一区二区视频| 久久99蜜桃精品| 亚洲午夜电影在线观看| 91免费精品国自产拍在线不卡| 欧美aaaaaa午夜精品| 一区二区三区四区中文字幕| 成人免费高清视频| 中文字幕一区二区在线播放| a级精品国产片在线观看|