精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Go語言,25秒讀取16GB文件

開發 后端
我們將使用Go語言,從一個大小為16GB的.txt或.log文件中提取日志。

[[407751]]

 當今世界的任何計算機系統每天都會生成大量的日志或數據。隨著系統的發展,將調試數據存儲到數據庫中是不可行的,因為它們是不可變的,并且只能用于分析和解決故障。所以大部分公司傾向于將日志存儲在文件中,而這些文件通常位于本地磁盤中。

[[407752]]

我們將使用Go語言,從一個大小為16GB的.txt或.log文件中提取日志。

讓我們開始編碼……

首先,我們打開文件。對于任何文件的IO,我們都將使用標準的Go os.File。 

  1. f, err :os.Open(fileName)  
  2.  if err != nil {  
  3.    fmt.Println("cannot able to read the file", err)  
  4.    return  
  5.  }  
  6. // UPDATE: close after checking error  
  7. defer file.Close()  //Do not forget to close the file 

打開文件后,我們有以下兩個選項可以選擇:

逐行讀取文件,這有助于減少內存緊張,但需要更多的時間。一次將整個文件讀入內存并處理該文件,這將消耗更多內存,但會顯著減少時間。

由于文件太大,即16 GB,因此無法將整個文件加載到內存中。但是第一種選擇對我們來說也是不可行的,因為我們希望在幾秒鐘內處理文件。

但你猜怎么著,還有第三種選擇。瞧……相比于將整個文件加載到內存中,在Go語言中,我們還可以使用bufio.NewReader()將文件分塊加載。 

  1. :bufio.NewReader(f)  
  2. for {  
  3. buf :make([]byte,4*1024) //the chunk size  
  4. n, err :r.Read(buf) //loading chunk into buffer  
  5.    bufbuf = buf[:n]  
  6. if n == 0 {     
  7.      if err != nil {  
  8.        fmt.Println(err)  
  9.        break  
  10.      }  
  11.      if err == io.EOF {  
  12.        break  
  13.      }  
  14.      return err  
  15.   }  

一旦我們將文件分塊,我們就可以分叉一個線程,即Go routine,同時處理多個文件區塊。上述代碼將修改為: 

  1. //sync pools to reuse the memory and decrease the preassure on Garbage Collector  
  2. linesPool :sync.Pool{New: func() interface{} {  
  3.         lines :make([]byte, 500*1024)  
  4.         return lines  
  5. }}  
  6. stringPool :sync.Pool{New: func() interface{} {  
  7.           lines :""  
  8.           return lines  
  9. }}  
  10. slicePool :sync.Pool{New: func() interface{} {  
  11.            lines :make([]string, 100)  
  12.            return lines  
  13. }}  
  14. :bufio.NewReader(f)  
  15. var wg sync.WaitGroup //wait group to keep track off all threads  
  16. for {   
  17.      buf :linesPool.Get().([]byte)  
  18.      n, err :r.Read(buf)  
  19.      bufbuf = buf[:n]  
  20. if n == 0 {  
  21.         if err != nil {  
  22.             fmt.Println(err)  
  23.             break  
  24.         }  
  25.         if err == io.EOF {  
  26.             break  
  27.         }  
  28.         return err  
  29.      }  
  30. nextUntillNewline, err :r.ReadBytes('\n')//read entire line    
  31.       if err != io.EOF {  
  32.          buf = append(buf, nextUntillNewline...)  
  33.      }    
  34.       wg.Add(1)  
  35.      go func() {      
  36.          //process each chunk concurrently 
  37.          //start -> log start time, end -> log end time   
  38.         ProcessChunk(buf, &linesPool, &stringPool, &slicePool,     start, end) 
  39. wg.Done()     
  40.       }()  
  41.  
  42. wg.Wait()  

上面的代碼,引入了兩個優化點:

sync.Pool是一個強大的對象池,可以重用對象來減輕垃圾收集器的壓力。我們將重用各個分片的內存,以減少內存消耗,大大加快我們的工作。Go Routines幫助我們同時處理緩沖區塊,這大大提高了處理速度。

現在讓我們實現ProcessChunk函數,它將處理以下格式的日志行。 

  1. 2020-01-31T20:12:38.1234Z, Some Field, Other Field, And so on, Till new line,...\n 

我們將根據命令行提供的時間戳提取日志。 

  1. func ProcessChunk(chunk []byte, linesPool *sync.Pool, stringPool *sync.Pool, slicePool *sync.Pool, start time.Time, end time.Time) {  
  2. //another wait group to process every chunk further                            
  3.        var wg2 sync.WaitGroup  
  4. logs :stringPool.Get().(string)  
  5. logs = string(chunk) 
  6.  linesPool.Put(chunk) //put back the chunk in pool  
  7. //split the string by "\n", so that we have slice of logs  
  8.       logsSlice :strings.Split(logs, "\n")  
  9. stringPool.Put(logs) //put back the string pool  
  10. chunkSize :100 //process the bunch of 100 logs in thread  
  11. :len(logsSlice)  
  12. noOfThread :n / chunkSize  
  13. if n%chunkSize != 0 { //check for overflow  
  14.           noOfThread++  
  15.       }  
  16. length :len(logsSlice)  
  17. //traverse the chunk  
  18.      for i :0; i < length; i += chunkSize {         
  19.           wg2.Add(1) 
  20. //process each chunk in saperate chunk  
  21.          go func(s int, e int) {  
  22.             for i:s; i<e;i++{  
  23.                text :logsSlice[i]  
  24. if len(text) == 0 {  
  25.                   continue  
  26.                }           
  27.              logParts :strings.SplitN(text, ",", 2)  
  28.             logCreationTimeString :logParts[0]  
  29.             logCreationTime, err :time.Parse("2006-01-  02T15:04:05.0000Z", logCreationTimeString)  
  30. if err != nil {  
  31.                  fmt.Printf("\n Could not able to parse the time :%s       for log : %v", logCreationTimeString, text)  
  32.                  return  
  33.             }  
  34. // check if log's timestamp is inbetween our desired period  
  35.           if logCreationTime.After(start) && logCreationTime.Before(end) {          
  36.              fmt.Println(text)  
  37.            }  
  38.         }  
  39.         textSlice = nil  
  40.         wg2.Done()     
  41.       }(i*chunkSize, int(math.Min(float64((i+1)*chunkSize), float64(len(logsSlice)))))  
  42.    //passing the indexes for processing  
  43. }    
  44.    wg2.Wait() //wait for a chunk to finish  
  45.    logsSlice = nil  

對上面的代碼進行基準測試。以16 GB的日志文件為例,提取日志所需的時間約為25秒。

完整的代碼示例如下: 

  1. func main() {  
  2.  s :time.Now()  
  3.  args :os.Args[1:]  
  4.  if len(args) != 6 { // for format  LogExtractor.exe -f "From Time" -t "To Time" -i "Log file directory location"  
  5.   fmt.Println("Please give proper command line arguments")  
  6.   return  
  7.  }  
  8.  startTimeArg :args[1]  
  9.  finishTimeArg :args[3]  
  10.  fileName :args[5]  
  11.  file, err :os.Open(fileName) 
  12.  if err != nil {  
  13.   fmt.Println("cannot able to read the file", err)  
  14.   return  
  15.  } 
  16.  defer file.Close() //close after checking err 
  17.  queryStartTime, err :time.Parse("2006-01-02T15:04:05.0000Z", startTimeArg)  
  18.  if err != nil {  
  19.   fmt.Println("Could not able to parse the start time", startTimeArg)  
  20.   return  
  21.  } 
  22.  queryFinishTime, err :time.Parse("2006-01-02T15:04:05.0000Z", finishTimeArg)  
  23.  if err != nil {  
  24.   fmt.Println("Could not able to parse the finish time", finishTimeArg)  
  25.   return  
  26.  }  
  27.  filestat, err :file.Stat()  
  28.  if err != nil {  
  29.   fmt.Println("Could not able to get the file stat")  
  30.   return  
  31.  }  
  32.  fileSize :filestat.Size()  
  33.  offset :fileSize - 1  
  34.  lastLineSize :0 
  35.  for {  
  36.   b :make([]byte, 1)  
  37.   n, err :file.ReadAt(b, offset)  
  38.   if err != nil {  
  39.    fmt.Println("Error reading file ", err)  
  40.    break  
  41.   }  
  42.   char :string(b[0])  
  43.   if char == "\n" {  
  44.    break  
  45.   }  
  46.   offset--  
  47.   lastLineSize += n  
  48.  }  
  49.  lastLine :make([]byte, lastLineSize)  
  50.  _, err = file.ReadAt(lastLine, offset+1)  
  51.  if err != nil {  
  52.   fmt.Println("Could not able to read last line with offset", offset, "and lastline size", lastLineSize)  
  53.   return 
  54.  }  
  55.  logSlice :strings.SplitN(string(lastLine), ",", 2)  
  56.  logCreationTimeString :logSlice[0]  
  57.  lastLogCreationTime, err :time.Parse("2006-01-02T15:04:05.0000Z", logCreationTimeString)  
  58.  if err != nil {  
  59.   fmt.Println("can not able to parse time : ", err)  
  60.  }  
  61.  if lastLogCreationTime.After(queryStartTime) && lastLogCreationTime.Before(queryFinishTime) {  
  62.   Process(file, queryStartTime, queryFinishTime)  
  63.  }  
  64.  fmt.Println("\nTime taken - ", time.Since(s))  
  65.   
  66. func Process(f *os.File, start time.Time, end time.Time) error {  
  67.  linesPool :sync.Pool{New: func() interface{} {  
  68.   lines :make([]byte, 250*1024)  
  69.   return lines  
  70.  }}  
  71.  stringPool :sync.Pool{New: func() interface{} {  
  72.   lines :""  
  73.   return lines  
  74.  }}  
  75.  r :bufio.NewReader(f)  
  76.  var wg sync.WaitGroup  
  77.  for {  
  78.   buf :linesPool.Get().([]byte)  
  79.   n, err :r.Read(buf)  
  80.   bufbuf = buf[:n]  
  81.   if n == 0 {  
  82.    if err != nil {  
  83.     fmt.Println(err)  
  84.     break  
  85.    }  
  86.    if err == io.EOF {  
  87.     break  
  88.    }  
  89.    return err  
  90.   }   
  91.   nextUntillNewline, err :r.ReadBytes('\n')  
  92.   if err != io.EOF {  
  93.    buf = append(buf, nextUntillNewline...)  
  94.   }  
  95.   wg.Add(1)  
  96.   go func() {  
  97.    ProcessChunk(buf, &linesPool, &stringPool, start, end)  
  98.    wg.Done()  
  99.   }()   
  100.  }  
  101.  wg.Wait()  
  102.  return nil  
  103.   
  104. func ProcessChunk(chunk []byte, linesPool *sync.Pool, stringPool *sync.Pool, start time.Time, end time.Time) {  
  105.  var wg2 sync.WaitGroup  
  106.  logs :stringPool.Get().(string)  
  107.  logs = string(chunk)   
  108.  linesPool.Put(chunk)  
  109.  logsSlice :strings.Split(logs, "\n")  
  110.  stringPool.Put(logs)  
  111.  chunkSize :300  
  112.  n :len(logsSlice)  
  113.  noOfThread :n / chunkSize 
  114.  if n%chunkSize != 0 {  
  115.   noOfThread++  
  116.  }  
  117.  for i :0; i < (noOfThread); i++ {  
  118.   wg2.Add(1)  
  119.   go func(s int, e int) {  
  120.    defer wg2.Done() //to avaoid deadlocks  
  121.    for i :s; i < e; i++ {  
  122.     text :logsSlice[i]  
  123.     if len(text) == 0 {  
  124.      continue  
  125.     }  
  126.     logSlice :strings.SplitN(text, ",", 2)  
  127.     logCreationTimeString :logSlice[0]  
  128.     logCreationTime, err :time.Parse("2006-01-02T15:04:05.0000Z", logCreationTimeString)  
  129.     if err != nil {  
  130.      fmt.Printf("\n Could not able to parse the time :%s for log : %v", logCreationTimeString, text)  
  131.      return  
  132.     }   
  133.     if logCreationTime.After(start) && logCreationTime.Before(end)  
  134.      //fmt.Println(text)  
  135.     }  
  136.    }   
  137.   }(i*chunkSize, int(math.Min(float64((i+1)*chunkSize), float64(len(logsSlice)))))  
  138.  }  
  139.  wg2.Wait() 
  140.  logsSlice = nil  
  141.  

 

責任編輯:龐桂玉 來源: 良許Linux
相關推薦

2021-07-08 10:50:02

Go語言16GB文件代碼

2023-06-12 07:20:39

2011-07-04 10:06:49

webOS 3.0TouchPad

2015-07-13 11:20:01

iPhone內存蘋果

2012-01-12 12:56:16

思科博科16Gb

2023-05-22 07:06:29

RTX 40608GB公版卡

2023-07-04 07:08:27

內存游戲容量

2014-04-11 14:35:16

16GB顯卡AMD

2023-07-24 08:14:04

8GB版本RTX

2019-11-06 15:16:12

16GB8GB內存

2012-06-04 14:13:48

盛大手機

2023-05-17 07:28:18

電腦16GB內存

2013-07-10 14:41:46

內存

2020-04-13 19:13:23

手機內存 PC

2019-05-28 15:32:56

筆記本Max-Q電腦

2019-07-01 10:30:27

存儲技術容器

2012-07-04 10:00:04

16GB DDR4服務器內存

2011-07-11 14:31:45

臺式機評測

2023-05-19 08:01:57

Go 語言map

2021-08-02 15:02:37

Go Excelize 開發
點贊
收藏

51CTO技術棧公眾號

黄色另类av| 天堂va在线高清一区| 国产女人aaa级久久久级 | 成人软件在线观看| 国产精品久久久久影视| 91精品久久香蕉国产线看观看| 国产真实的和子乱拍在线观看| 色天天色综合| 91精品国产综合久久小美女 | 日产欧产美韩系列久久99| 最新91在线视频| 无码任你躁久久久久久老妇| 久久久加勒比| 欧美日韩亚洲91| 国产四区在线观看| 男女污视频在线观看| 国产精一区二区三区| 国产国产精品人在线视| 久久久久久天堂| 日韩成人综合| 精品视频—区二区三区免费| 永久免费黄色片| 另类图片综合电影| 亚洲成av人片一区二区三区| 亚洲综合网中心| 性猛交xxxx| 国产成人免费在线| 国产精品一区久久| 精品人妻一区二区三区潮喷在线| 欧美午夜国产| 久久精品视频在线播放| 中文字幕高清视频| 卡通动漫国产精品| 日韩免费视频线观看| 最新av免费在线观看| 日本.亚洲电影| 粉嫩老牛aⅴ一区二区三区| 好吊色视频988gao在线观看| 日韩欧美小视频| 久久精品在线观看| 精品一区二区三区视频日产| 性生活三级视频| 国产一区二区三区免费在线观看| 国产精品久久久久久一区二区| 国产又黄又粗又爽| 亚洲精选成人| 性色av一区二区三区| 精品无码黑人又粗又大又长| 欧美色123| 欧美大片第1页| 青青操国产视频| 欧美激情五月| 久久91亚洲精品中文字幕奶水 | 精品国产福利视频| 国产一线二线三线女| 久久久久黄久久免费漫画| 亚洲激情图片一区| 国产精品免费看久久久无码| 91高清在线观看视频| 亚洲精品欧美专区| 日本大片免费看| 多野结衣av一区| 精品欧美激情精品一区| 黄色av网址在线播放| 色综合亚洲图丝熟| 色激情天天射综合网| 精品久久久久久中文字幕2017| 香蕉成人av| 欧美三级资源在线| 国产乱叫456| 亚洲一区二区三区四区电影| 欧美不卡一二三| 亚洲男人在线天堂| 国产欧美日韩视频在线| 中文字幕无线精品亚洲乱码一区| 亚洲熟女毛茸茸| 欧美三级网页| 日韩av电影在线网| 一级黄色免费片| 粉嫩av亚洲一区二区图片| 91成人免费观看| 四虎国产精品永远| 日韩一区在线免费观看| 青春草国产视频| 久久人体大尺度| 91麻豆精品国产91久久久久 | 亚洲香蕉在线视频| 国产精品一区专区| 欧美成熟毛茸茸复古| 中文字幕在线播放| 亚洲一级二级三级| 天天爽人人爽夜夜爽| 96sao精品免费视频观看| 精品国产乱码久久久久久浪潮| 亚洲第一成人网站| 欧美一区二区三区免费看| 91福利视频在线观看| 亚洲怡红院av| 99久久综合狠狠综合久久| 亚洲欧美丝袜| cao在线视频| 欧美喷水一区二区| aaaaaav| 91麻豆国产自产在线观看亚洲| 欧美国产视频日韩| 亚洲特级黄色片| fc2成人免费人成在线观看播放| 神马一区二区影院| jizzjizz中国精品麻豆| 欧美区在线观看| 亚洲做受高潮无遮挡| 欧美一区影院| 国产精品一二区| 三级视频在线播放| 亚洲一区二区黄色| 亚洲制服中文字幕| 青青草97国产精品麻豆| 国内外成人免费激情在线视频| 中文字幕一区二区三区四区视频| 成人白浆超碰人人人人| 蜜桃视频成人在线观看| 免费在线观看一区| 亚洲国模精品私拍| 久久精品99国产精| 久久99精品国产麻豆婷婷| 免费久久一级欧美特大黄| 草美女在线观看| 欧美精品在线观看一区二区| 日本一级免费视频| 小嫩嫩精品导航| 精品免费日产一区一区三区免费| 中文字幕在线观看播放| 欧美日韩国产美女| 国产性猛交xx乱| 视频一区视频二区中文字幕| 精品亚洲一区二区三区四区五区高| 亚洲区欧洲区| 91精品国产综合久久久蜜臀粉嫩| 久久日免费视频| 母乳一区在线观看| 久久精品丝袜高跟鞋| free性m.freesex欧美| 亚洲精品在线观看视频| 国产精品成人免费观看| 国产精品一区二区你懂的| 特级黄色录像片| 动漫一区二区三区| 久久精品这里热有精品| 91av久久久| 综合欧美亚洲日本| 午夜影院免费观看视频| 欧美国产专区| 国产福利不卡| 成人ssswww在线播放| 日韩电视剧免费观看网站| 日韩美女黄色片| 91免费视频大全| a√天堂在线观看| 九九久久电影| 国产精品久久久久久久7电影| 成人在线视频成人| 欧美日韩中文国产| 五月天av网站| 国产白丝网站精品污在线入口 | 久久久久99| 亚州欧美一区三区三区在线| 亚洲日本免费电影| 欧美老女人在线视频| 日韩中文字幕观看| 一本在线高清不卡dvd| 特级西西www444人体聚色| 奇米色一区二区三区四区| 中文字幕一区二区三区在线乱码| 电影中文字幕一区二区| 国语自产精品视频在线看| 欧美色图另类| 欧美一区午夜视频在线观看 | 麻豆传媒在线免费看| 日韩欧美色电影| 午夜毛片在线观看| 中文字幕亚洲在| 亚洲麻豆一区二区三区| 日韩电影一区二区三区| 国产一二三四区在线观看| 日韩中文av| 成人精品视频久久久久| 97人澡人人添人人爽欧美| 国产一区二区三区视频| 国产高清视频免费观看| 日韩欧美在线观看视频| 东方av正在进入| 久久久久久电影| 91亚洲一区二区| 一区二区国产精品| 一区二区三区四区五区精品| 97久久综合区小说区图片区| 国产精品电影一区| 在线三级电影| 国产亚洲欧洲黄色| 后入内射欧美99二区视频| 欧美主播一区二区三区| 国产极品在线播放| 国产精品麻豆网站| 狠狠人妻久久久久久综合蜜桃| 国精产品一区一区三区mba视频 | 欧美日韩成人免费观看| 国产三级精品在线| 先锋资源av在线| 国产专区欧美精品| 十八禁视频网站在线观看| 中文字幕日韩欧美精品高清在线| 日韩美女一区| 青青草原在线亚洲| 成人欧美一区二区三区视频 | 宅男噜噜噜66国产日韩在线观看| 亚洲人一区二区| 亚洲精品白浆高清| 国产视色精品亚洲一区二区| av在线亚洲一区| 国产精品欧美亚洲777777| 亚洲深夜视频| 97在线视频免费观看| 污污的视频在线观看| 日韩有码在线电影| 无遮挡的视频在线观看| 亚洲无线码在线一区观看| 天天摸夜夜添狠狠添婷婷| 日韩一本二本av| 99精品在线看| 欧美精品免费视频| 中文字幕久久网| 欧美亚洲高清一区二区三区不卡| 日本韩国欧美中文字幕| 亚洲 欧美综合在线网络| 久久亚洲AV无码| 亚洲自拍偷拍av| 久久午夜无码鲁丝片午夜精品| 日韩理论片在线| 一起操在线播放| 亚洲视频免费在线观看| 午夜三级在线观看| 成人免费小视频| 亚洲精品久久久久久国| 1000精品久久久久久久久| 免费黄色国产视频| 国产精品久久99| 国产精品视频一区二区三 | 亚洲色欲久久久综合网东京热| 欧美在线亚洲综合一区| 精品无码av无码免费专区| 一区二区日韩欧美| 97久久国产亚洲精品超碰热| 亚洲国产日韩欧美在线| 9l视频自拍9l视频自拍| 99久精品视频在线观看视频| 伊人久久av导航| 91精品二区| 国产精品久久久久久久久电影网| 尤物在线精品| 18岁网站在线观看| 久久精品女人| 老司机久久精品| 国产成人在线看| 亚洲观看黄色网| 国产农村妇女毛片精品久久麻豆| 四虎影视一区二区| 亚洲精品视频观看| 国产成人无码精品亚洲| 色国产综合视频| 一级黄色片在线观看| 精品奇米国产一区二区三区| 午夜影院免费视频| 国产一区二区美女视频| 免费av网站在线看| 午夜精品久久久久久99热软件| av综合电影网站| 国产在线视频91| 精品久久ai电影| 亚洲欧洲一区二区福利| 亚洲私拍自拍| 能看的毛片网站| 国产成人免费视频| 亚洲av综合一区二区| 综合久久久久久| 在线观看免费av片| 日韩一级精品视频在线观看| 日韩精品视频无播放器在线看 | 精品美女在线观看| 久草在线青青草| 欧美成人午夜激情视频| 欧美性xxx| 亚洲xxx自由成熟| 国产一区二区三区网| 日韩中文字幕在线不卡| 老司机午夜精品视频在线观看| 午夜视频在线网站| 成人av电影免费观看| 日韩一卡二卡在线观看| 欧美日韩综合视频网址| 国产视频一区二区三区四区五区| 精品中文字幕久久久久久| 91精选在线| 国产精品久久久av| 日韩欧美黄色| 4444亚洲人成无码网在线观看| 喷白浆一区二区| 污片免费在线观看| 伊人婷婷欧美激情| 丰满熟女人妻一区二区三| 日韩av在线免费观看| 91精品久久久| 成人黄色av播放免费| 精品久久成人| 91猫先生在线| 国产91在线观看丝袜| а天堂中文在线资源| 一本色道久久综合精品竹菊| 成人精品在线播放| 久久精品国产欧美亚洲人人爽| 在线观看精品| 久久精品日产第一区二区三区精品版| 欧美黄色一区二区| 亚洲精品综合在线观看| 国产精品嫩草久久久久| 区一区二在线观看| 日韩精品在线视频美女| 7777kkk亚洲综合欧美网站| 亚洲精品欧美日韩| 日韩成人影院| 亚洲 激情 在线| 日本一区二区久久| 波多野结衣电车痴汉| 亚洲欧美精品中文字幕在线| 国产乱码午夜在线视频| 国产主播一区二区三区四区| 亚洲第一伊人| 日韩 中文字幕| 精品成人av一区| 日漫免费在线观看网站| 国内精品久久久久久中文字幕| 久久九九精品视频| 激情视频小说图片| 极品美女销魂一区二区三区| 免费成年人视频在线观看| 6080yy午夜一二三区久久| 国产在线观看免费麻豆| 亚洲mm色国产网站| 亚洲综合小说| 欧美熟妇精品一区二区| 亚洲图片欧美色图| 污污的视频网站在线观看| 4438全国成人免费| 久久不见久久见免费视频7| 粉嫩虎白女毛片人体| 欧美韩日一区二区三区| 国产精品久久久久久久免费| 伦伦影院午夜日韩欧美限制| 亚洲午夜精品| 九一国产精品视频| 久久精品视频一区二区三区| 波多野结衣网站| 久久精品中文字幕免费mv| 一区二区三区四区高清视频 | 日本在线观看中文字幕| 日韩av综合网| 日本在线中文字幕一区二区三区| 亚洲第一在线综合在线| 国产又黄又大久久| 国产成人愉拍精品久久 | 色婷婷av在线| 精品一区二区三区日本| 美女一区二区三区在线观看| 91成人福利视频| 亚洲美女在线视频| 日日夜夜精品| cao在线观看| 91日韩在线专区| 91久久国语露脸精品国产高跟| 欧美精品少妇videofree| 日韩精品a在线观看91| 亚洲黄色av网址| 伊人夜夜躁av伊人久久| 免费人成在线观看网站| 97操在线视频| 老司机精品视频网站| 全网免费在线播放视频入口| 亚洲黄色在线看| 亚洲福利影视| 各处沟厕大尺度偷拍女厕嘘嘘| 亚洲欧美在线观看| 深夜福利在线视频| 成人在线视频福利| 国产精品久久国产愉拍| 性欧美videos| 亚洲一区二区国产| 99精品在免费线中文字幕网站一区| 久久精品午夜福利| 亚洲国产精品人人做人人爽| 9色在线视频| 久久影视中文粉嫩av|