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

主頁 > 知識庫 > 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久久精品欧美| 亚洲国产va精品久久久不卡综合| 国产精品久久二区二区| 国产精品卡一卡二| 1024精品合集| 亚洲午夜电影在线观看| 亚洲乱码日产精品bd| 一二三四社区欧美黄| 午夜电影网亚洲视频| 六月丁香婷婷久久| 国产精品99久久不卡二区| 国产精品99久久久久久有的能看| av一二三不卡影片| 欧美日韩亚洲综合| 久久精品在这里| 亚洲图片另类小说| 亚洲国产精品自拍| 精品一区二区三区在线观看国产| 成人午夜视频网站| 欧美日韩一区二区三区不卡| 精品久久久久久最新网址| 国产精品午夜在线| 亚洲二区在线观看| 国产麻豆欧美日韩一区| 色综合久久中文综合久久97 | 国产精品久久久99| 亚洲第一成人在线| 激情国产一区二区| 色天天综合久久久久综合片| 欧美一卡二卡在线观看| 日本一区二区三区久久久久久久久不| 亚洲精品视频自拍| 国产一区二区在线视频| 欧美日韩一级大片网址| 国产精品色在线观看| 日韩激情中文字幕| 不卡的看片网站| 精品久久久久一区| 舔着乳尖日韩一区| 99re热这里只有精品免费视频| 欧美日本免费一区二区三区| 国产精品乱码人人做人人爱| 日韩高清不卡在线| 色噜噜狠狠成人中文综合 | 国产成人综合视频| 欧美视频日韩视频在线观看| 国产精品乱码一区二区三区软件 | 国产成人综合网| 欧美一区二区黄| 一区二区三区四区在线| 成人永久aaa| 国产区在线观看成人精品| 日韩中文字幕区一区有砖一区| 99国产精品一区| 国产亚洲欧美中文| 久久99久久精品| 日韩欧美在线综合网| 亚洲小说欧美激情另类| 99r精品视频| 国产精品美女一区二区| 国产成人福利片| 欧美电视剧免费全集观看| 日本欧美在线观看| 678五月天丁香亚洲综合网| 亚洲一二三四久久| 91久久国产最好的精华液| 日韩毛片精品高清免费| 91丨porny丨国产| 日韩久久一区二区| 不卡视频在线观看| 国产精品三级av| 99精品一区二区三区| 亚洲另类中文字| 欧美私模裸体表演在线观看| 亚洲综合免费观看高清完整版 | 国产 日韩 欧美大片| 久久嫩草精品久久久精品| 国产盗摄一区二区三区| 国产人成亚洲第一网站在线播放| 国产成人av电影在线观看| 中文字幕乱码一区二区免费| 不卡的av网站| 一区二区三区在线免费| 欧美日韩国产精品自在自线| 丝袜a∨在线一区二区三区不卡| 91精品国产91久久久久久一区二区| 亚洲不卡在线观看| 日韩欧美三级在线| 成人午夜大片免费观看| 亚洲视频一二区| 欧美高清视频在线高清观看mv色露露十八| 亚洲亚洲精品在线观看| 欧美精品一区二区三区在线| 国产精品久久久久久妇女6080 | 国产精品1区2区| 26uuu欧美| 成+人+亚洲+综合天堂| 亚洲精品乱码久久久久| 91精品国产综合久久久久久| 狠狠狠色丁香婷婷综合久久五月| 国产欧美精品一区| 欧美午夜精品一区二区三区| 久久99热这里只有精品| 亚洲免费在线看| 欧美mv日韩mv亚洲| 色婷婷一区二区| 国产在线日韩欧美| 亚洲高清在线精品| 国产目拍亚洲精品99久久精品| 欧美专区亚洲专区| 国产盗摄女厕一区二区三区 | 欧美一级在线免费| a级精品国产片在线观看| 视频一区视频二区中文字幕| 亚洲国产成人午夜在线一区 | 国产精一区二区三区| 夜夜嗨av一区二区三区四季av| 26uuuu精品一区二区| 欧美日韩免费视频| av亚洲精华国产精华精华| 久草热8精品视频在线观看| 亚洲欧美自拍偷拍色图| 日韩欧美专区在线| 欧美日韩精品欧美日韩精品一| 99在线视频精品| 国产精品99久久久久久似苏梦涵| 日韩精品久久久久久| 亚洲一区二区欧美日韩| 亚洲欧洲精品成人久久奇米网| 精品国产乱码久久久久久影片| 欧美三级电影在线看| 在线精品国精品国产尤物884a| 成人激情小说乱人伦| 国产一区亚洲一区| 另类小说综合欧美亚洲| 午夜精品福利视频网站| 亚洲国产精品久久久久婷婷884| 国产精品丝袜久久久久久app| 精品嫩草影院久久| 日韩三级视频在线看| 欧美人成免费网站| 欧美日韩国产乱码电影| 欧美视频在线播放| 在线免费一区三区| 91久久精品午夜一区二区| 色综合中文字幕国产| 97精品电影院| 色综合久久六月婷婷中文字幕| 粉嫩绯色av一区二区在线观看| 麻豆精品在线视频| 精品中文字幕一区二区小辣椒| 美女视频网站黄色亚洲| 久久精品72免费观看| 国产高清不卡一区| 粉嫩av亚洲一区二区图片| 不卡的av网站| 欧美在线不卡视频| 欧美视频三区在线播放| 91精品国产手机| 精品免费视频.| 国产拍欧美日韩视频二区| 国产精品久99| 亚洲高清免费观看| 日韩在线一区二区三区| 日韩成人一区二区三区在线观看| 麻豆中文一区二区| 国产不卡在线播放| 日本高清不卡一区| 538prom精品视频线放| 精品免费视频一区二区| 中文成人综合网| 亚洲国产日产av| 久久99蜜桃精品| 成人不卡免费av| 精品视频色一区| 久久精品日韩一区二区三区| 国产精品久久久久久久久免费相片| 亚洲色图欧洲色图婷婷| 午夜精品一区二区三区电影天堂 | 精品粉嫩aⅴ一区二区三区四区| 欧美日韩国产首页| 久久精品亚洲国产奇米99| 国产精品盗摄一区二区三区| 午夜天堂影视香蕉久久| 大胆亚洲人体视频| 欧美日韩国产不卡| 亚洲天堂av一区| 日日嗨av一区二区三区四区| 欧美午夜精品久久久久久超碰| 日韩免费高清av| 亚洲人成精品久久久久| 久久成人羞羞网站| 欧美日韩在线一区二区| 国产日韩欧美精品在线| 一区二区三区四区在线播放| 国产永久精品大片wwwapp| 欧洲人成人精品| 亚洲欧美在线视频观看|