校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 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 實現超大文件讀取的兩種方法的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧洲色大大久久| 久久99久久99| 色婷婷香蕉在线一区二区| 亚洲女子a中天字幕| 欧美亚日韩国产aⅴ精品中极品| 一区二区三区中文字幕精品精品| 欧美视频在线不卡| 蜜桃免费网站一区二区三区| 精品国产91亚洲一区二区三区婷婷 | 亚洲综合色视频| 欧美日本一区二区三区四区| 免费精品视频最新在线| 国产日韩欧美精品在线| 99视频精品免费视频| 亚洲国产sm捆绑调教视频 | 久久综合久久综合亚洲| 成人99免费视频| 亚洲一级不卡视频| 精品久久久久久久久久久久包黑料| 国产精品香蕉一区二区三区| 亚洲欧美日韩系列| 欧美成人综合网站| 91免费国产视频网站| 肉肉av福利一精品导航| 中文一区一区三区高中清不卡| 色婷婷亚洲一区二区三区| 日韩成人一级大片| 椎名由奈av一区二区三区| 91精品国产乱码| 99精品桃花视频在线观看| 男女男精品视频| 亚洲视频香蕉人妖| 精品国产乱码久久久久久牛牛| 91网上在线视频| 国产精品一区二区你懂的| 午夜精品一区在线观看| 中文字幕国产一区二区| 91麻豆精品国产无毒不卡在线观看| 成人免费视频视频在线观看免费| 日日摸夜夜添夜夜添国产精品| 中文字幕在线观看不卡| 日韩久久久久久| 欧美亚一区二区| 99视频精品在线| 国产成人精品一区二区三区四区 | 日本不卡一区二区三区| 亚洲欧美在线视频| 久久亚洲私人国产精品va媚药| 欧美图区在线视频| 99精品欧美一区| 国产mv日韩mv欧美| 国产综合色在线视频区| 日韩av电影免费观看高清完整版| 亚洲精品自拍动漫在线| 久久久久久久久久电影| 欧美成人一区二区三区片免费| 欧美精品一二三四| 欧美性做爰猛烈叫床潮| 色综合久久中文综合久久97| 成人动漫一区二区在线| 国产美女主播视频一区| 韩国欧美一区二区| 精品亚洲aⅴ乱码一区二区三区| 婷婷中文字幕一区三区| 亚洲成人自拍一区| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲色图丝袜美腿| 国产精品久久久久婷婷| 国产精品网站在线| 中文字幕精品三区| 中文字幕在线不卡一区| 最新日韩在线视频| 亚洲欧美精品午睡沙发| 亚洲日本电影在线| 一区二区免费看| 亚洲国产视频网站| 午夜久久久久久电影| 丝袜美腿亚洲综合| 久久精品国产免费| 国产伦精品一区二区三区免费迷| 国产美女精品人人做人人爽| 国产精品77777| 福利91精品一区二区三区| 成人av高清在线| 91在线看国产| 欧美午夜精品久久久| 欧美日韩一区二区在线观看| 在线免费观看日本欧美| 欧美日韩一区二区三区视频| 欧美浪妇xxxx高跟鞋交| 日韩欧美中文一区| 久久精品日韩一区二区三区| 亚洲欧洲在线观看av| 一区二区在线观看视频| 日日夜夜一区二区| 国模一区二区三区白浆| 99久久99久久精品国产片果冻 | 日韩电影免费在线| 国产精品一区专区| 色综合咪咪久久| 日韩免费福利电影在线观看| 久久久美女艺术照精彩视频福利播放| 欧美国产日韩亚洲一区| 亚洲在线视频一区| 国产做a爰片久久毛片| 91在线观看一区二区| 欧美日韩电影一区| 国产欧美精品一区二区三区四区| 亚洲人成在线观看一区二区| 婷婷中文字幕综合| 成人污视频在线观看| 欧美日韩中文字幕一区二区| 久久久精品黄色| 亚洲国产欧美在线| 国产v综合v亚洲欧| 欧美丰满少妇xxxbbb| 国产精品欧美综合在线| 日韩中文字幕区一区有砖一区| 国产一区欧美二区| 欧美日韩国产a| 国产精品久久久久四虎| 麻豆视频观看网址久久| 色婷婷激情久久| 国产亚洲精品7777| 日本aⅴ免费视频一区二区三区 | 欧美视频第二页| 国产精品网曝门| 久久精品国产在热久久| 色噜噜久久综合| 中日韩免费视频中文字幕| 捆绑变态av一区二区三区| 日本乱人伦aⅴ精品| 国产精品污污网站在线观看| 欧美aⅴ一区二区三区视频| 在线观看精品一区| 中文字幕欧美日韩一区| 美女视频黄免费的久久 | 欧美xxxxxxxx| 亚洲午夜久久久| 色菇凉天天综合网| 国产精品美女久久久久久久网站| 久久97超碰国产精品超碰| 欧美日韩在线三级| 亚洲三级视频在线观看| 成年人国产精品| 国产亚洲人成网站| 久久91精品久久久久久秒播| 欧美久久久久久蜜桃| 亚洲一区自拍偷拍| 色欲综合视频天天天| 国产精品美女久久久久久久久| 激情综合色综合久久综合| 欧美久久免费观看| 五月天国产精品| 欧美日韩电影在线播放| 天天综合网天天综合色| 欧美日韩亚洲综合一区| 亚洲成a人v欧美综合天堂下载| 99r精品视频| 亚洲精品成人在线| 色噜噜狠狠成人网p站| 中文字幕人成不卡一区| 99久久精品国产毛片| 最新热久久免费视频| 97se亚洲国产综合自在线| 中文字幕一区日韩精品欧美| 成人激情免费网站| 亚洲人精品午夜| 在线日韩国产精品| 亚洲成av人综合在线观看| 欧美电影在线免费观看| 日韩电影免费一区| 亚洲精品在线电影| 国产一区二区三区精品欧美日韩一区二区三区 | 国产亲近乱来精品视频| 北岛玲一区二区三区四区| 国产精品亲子乱子伦xxxx裸| 99国产精品久久久久久久久久| 亚洲欧美在线aaa| 91传媒视频在线播放| 天使萌一区二区三区免费观看| 91精品国产乱码| 国产一区二区精品久久99| 中文字幕免费不卡| 色婷婷亚洲婷婷| 日本vs亚洲vs韩国一区三区| 精品欧美黑人一区二区三区| 国产精品亚洲人在线观看| 中文字幕日本不卡| 欧美精品精品一区| 国产麻豆成人精品| 亚洲精品少妇30p| 欧美二区乱c少妇| 粉嫩aⅴ一区二区三区四区 | 国产精品视频九色porn| 色婷婷综合久久久久中文一区二区 | 成人亚洲一区二区一| 亚洲综合在线免费观看| 欧美一二三四区在线| 成人免费高清视频|