精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产一本一道久久香蕉| 午夜精品视频一区二区三区在线看| 亚洲精品国产高清久久伦理二区| 97免费高清电视剧观看| www.日本精品| 欧美一级精品| 日韩网站在线看片你懂的| 丰满爆乳一区二区三区| 视频免费一区| 99视频精品免费视频| 国产精品久久久久久久久久久新郎 | www.日韩一区| 一本一道久久a久久精品蜜桃| 精品国产露脸精彩对白| 黄色手机在线视频| 国产一二三在线| 国产精品视频线看| 国产一区二区免费电影| 国产精品久久免费| 久热国产精品| 久久久人成影片一区二区三区观看| 色一情一交一乱一区二区三区 | 国精产品一区二区| 91无套直看片红桃| 久久天堂成人| 国内精品久久久久久中文字幕| 亚洲aaa视频| 亚洲综合图色| 亚洲国产精品va在线观看黑人| www.99r| 国产精品扒开腿做爽爽爽视频软件| 一区二区三区欧美久久| 中文字幕av日韩精品| 你懂得在线网址| a级高清视频欧美日韩| 成人午夜黄色影院| 中文在线资源天堂| 久久中文在线| 欧美有码在线观看| 国产无精乱码一区二区三区| 欧美韩国一区| 久久久91精品国产| 久久精品三级视频| 欧美女优在线视频| 亚洲欧美在线播放| 亚洲一区二区三区综合| 大陆精大陆国产国语精品| 日韩午夜小视频| 涩涩网站在线看| 日韩三级一区| 欧美男生操女生| 在线免费观看av网| 久久久国产精品入口麻豆| 欧美日韩精品高清| xxww在线观看| 伊人久久一区| 91精品国产一区二区人妖| jizzzz日本| 国产亚洲久久| 日韩精品一区在线| 在线看黄色的网站| 久久久久久久久久久久久久久久久久久久| 精品国产免费一区二区三区四区| 久久无码专区国产精品s| 久久精品国产亚洲blacked| 亚洲护士老师的毛茸茸最新章节| 精品国产av色一区二区深夜久久 | 国产一区二区三区黄视频| 亚洲va欧美va国产综合久久| www.97av| 国产精一品亚洲二区在线视频| 91精品国产高清久久久久久91裸体| 国产伦精品一区二区三区四区| 国产麻豆日韩欧美久久| 国产91一区二区三区| 天天操天天插天天射| 久久这里只有精品6| 欧美色欧美亚洲另类七区| av在线电影院| 一级特黄大欧美久久久| 大陆极品少妇内射aaaaa| 天天免费亚洲黑人免费| 欧美日韩中字一区| 图片区乱熟图片区亚洲| 成人涩涩网站| 国产一区二区三区日韩欧美| 日韩欧美中文字幕视频| 99精品久久| 国产精品久久久久久久久久ktv| 国产伦精品一区二区三区四区 | 国产jk精品白丝av在线观看| 久久综合av| 久久久午夜视频| 国产成人自拍偷拍| 国产在线精品国自产拍免费| 国产午夜精品在线| www.亚洲资源| 亚洲国产一区视频| 欧美成人黄色网址| 都市激情亚洲欧美| xxx一区二区| 国产精品黄色大片| 国产一区二区精品久久| 日本一区精品| 啊啊啊久久久| 88在线观看91蜜桃国自产| 亚洲av成人片色在线观看高潮| 国产精品videosex性欧美| 91精品国产成人www| 国产又爽又黄免费软件| 国产夜色精品一区二区av| 国产又粗又长又爽视频| 第四色男人最爱上成人网| 精品久久久久久无| 国产成人在线网址| 乱人伦精品视频在线观看| 99久久99久久| 蜜芽在线免费观看| 在线观看中文字幕不卡| 亚洲色偷偷色噜噜狠狠99网| 天天影视综合| 国产精品国产三级国产aⅴ9色 | 精品国产亚洲一区二区在线观看| 亚洲另类激情图| 久久久久性色av无码一区二区| 欧美aⅴ一区二区三区视频| 久久久久资源| 日本动漫同人动漫在线观看| 在线播放/欧美激情| 国产毛片欧美毛片久久久| 国产日韩一区二区三区在线| 国产精品久久精品视| www免费在线观看| 欧美精品自拍偷拍动漫精品| 婷婷色一区二区三区| 国产亚洲综合精品| 国产精品乱码| 久久亚洲导航| 日韩精品一区二区三区在线 | www免费网站在线观看| 欧美视频一区二区三区…| 天堂www中文在线资源| 国产精品啊啊啊| 96国产粉嫩美女| 岛国中文字幕在线| 4438x成人网最大色成网站| 五月婷婷六月香| 美国一区二区三区在线播放 | 国产精品一区二区三区在线| 99视频免费在线观看| 欧美一区二区三区四区久久| 丝袜美腿小色网| 国产福利一区二区| 路边理发店露脸熟妇泻火| 国产午夜久久av| 欧美国产日产韩国视频| 蜜桃91麻豆精品一二三区| 亚洲精品中文字幕乱码三区| 午夜诱惑痒痒网| 欧美久久久久| 精品久久久久久综合日本| 亚洲国产欧美日本视频| 国产亚洲激情视频在线| 91丨九色丨丰满| 亚洲影院理伦片| 亚洲av无码一区二区三区观看| 香蕉av777xxx色综合一区| 品久久久久久久久久96高清| 成人在线免费电影网站| 日韩中文有码在线视频| www.五月婷| 欧美性猛xxx| 少妇太紧太爽又黄又硬又爽小说| 国产真实精品久久二三区| 国产精品三级一区二区| 日韩精品导航| 国产乱肥老妇国产一区二 | 天天插天天干天天操| 色婷婷亚洲一区二区三区| 又色又爽的视频| 国产精品影视天天线| 日韩a∨精品日韩在线观看| 九九视频精品全部免费播放| 成人激情电影一区二区| 成年人国产在线观看| 亚洲色图狂野欧美| 国产av无码专区亚洲av| 欧美日韩激情小视频| 影音先锋男人看片资源| 成人免费毛片嘿嘿连载视频| 好男人www社区| 欧美日韩视频| 午夜精品区一区二区三| 2020国产精品极品色在线观看| 庆余年2免费日韩剧观看大牛| 久久黄色美女电影| 亚洲精品久久久久久下一站| 亚洲一区二区视频在线播放| 五月激情六月综合| 欧美手机在线观看| 91麻豆123| www.四虎精品| 经典三级在线一区| 精品视频无码一区二区三区| 天天插综合网| 你懂的视频在线一区二区| 玖玖玖视频精品| 国产精品91久久久| www视频在线观看| 欧美精品一区三区| 香蕉视频在线播放| 亚洲色图50p| 欧美性受xxxx狂喷水| 欧美高清视频一二三区| 不卡av电影在线| 精品国产乱码久久久久久虫虫漫画| www色aa色aawww| 欧美韩国日本不卡| 人妻熟女aⅴ一区二区三区汇编| 国产一区高清在线| 在线观看免费的av| 爽爽淫人综合网网站| 日韩日韩日韩日韩日韩| 国产一区日韩一区| 潘金莲一级淫片aaaaa免费看| 欧美女优在线视频| 欧美一区二区在线| 西瓜成人精品人成网站| 国产一区精品在线| 丁香综合av| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 中文字幕免费高清网站| 午夜精品一区二区三区电影天堂 | 精品久久久网站| 国产美女精品视频国产| 91精品午夜视频| 国产永久免费视频| 欧美日韩在线亚洲一区蜜芽| 国产精品欧美综合| 欧美中文字幕一区二区三区| 激情五月婷婷网| 色婷婷精品大视频在线蜜桃视频| 亚洲天堂一区在线| 欧美视频中文在线看| 国产精品视频免费播放| 精品国产999| 国产精品乱子伦| 欧美日韩在线观看视频| 综合激情网五月| 一本色道久久综合精品竹菊| 一级做a爰片久久毛片| 色婷婷av一区二区三区之一色屋| 五月婷婷视频在线| 91国内精品野花午夜精品 | av中文字幕在线观看第一页| 久久久久久亚洲精品| 91破解版在线观看| 国产69精品久久久久久| 裤袜国产欧美精品一区| 国产精品成人在线| 成人综合日日夜夜| 国产v亚洲v天堂无码| 牛牛影视久久网| 日韩福利二区| 婷婷综合五月| 可以看毛片的网址| 亚欧成人精品| 亚洲综合婷婷久久| 国产一区二区电影| 最近2019年日本中文免费字幕| 国产又色又爽又黄又免费| 日韩一区二区电影在线| 后进极品白嫩翘臀在线视频| 日韩成人久久久| 在线免费看a| 久久99精品久久久久久青青91| 国产一二在线播放| 国产男人精品视频| 999久久久精品一区二区| 欧美精品七区| 国产精品成人av| 波多野结衣乳巨码无在线| 奇米色一区二区| 成人做爰69片免费| 久久久久久综合| 日韩一区二区三区四区在线| 福利一区福利二区微拍刺激| 在线观看国产小视频| 欧美一级久久久| 亚洲欧美综合一区二区| www.久久久久| 高潮一区二区| 97久久人人超碰caoprom欧美| 中文有码一区| 黑人巨茎大战欧美白妇| 久久aⅴ乱码一区二区三区| www.夜夜爽| 91在线观看污| 国产极品美女在线| 在线一区二区观看| 男人天堂av网| 久久亚洲精品一区二区| 三级成人在线| 好吊色欧美一区二区三区视频 | 日本道在线视频| 久久久人人人| 国产免费无码一区二区| 国产精品丝袜久久久久久app| 日韩av一区二区在线播放| 91精品在线免费| av在线播放免费| 2019中文在线观看| caoporn成人| 大桥未久一区二区三区| 日韩精品电影在线观看| 日韩精品视频一区二区| 亚洲精品你懂的| 午夜久久久久久久久久影院| 亚洲精品成人av| 黄色成人在线网| 97av自拍| 欧美视频四区| 中文字幕乱妇无码av在线| 中文字幕一区二区三区乱码在线| 日韩三级一区二区| 国产视频久久网| 九色porny丨入口在线| 97久草视频| 欧美激情在线| 亚洲一二区在线观看| 亚洲人成人一区二区在线观看| 中文字幕视频在线播放| 国产一区二区免费| 欧美va视频| 日本一区二区不卡高清更新| 久久久xxx| 蜜桃av乱码一区二区三区| 色丁香久综合在线久综合在线观看| 十九岁完整版在线观看好看云免费| 国内精品久久久久久久久| 国产丝袜一区| 免费无码毛片一区二三区| 不卡影院免费观看| 午夜精品三级久久久有码| 亚洲精品二三区| 韩国成人漫画| 日本一区二区三区四区高清视频| 日韩精品一级中文字幕精品视频免费观看 | 国模极品一区二区三区| 国产乱人伦精品一区| 日韩a∨精品日韩在线观看| 2021中文字幕一区亚洲| 午夜精品一区二| 中文字幕最新精品| 99精品视频在线免费播放| 中国女人做爰视频| 成人手机电影网| 免费av网站在线| 伊是香蕉大人久久| 台湾天天综合人成在线| 国产人妻人伦精品| www.日韩在线| 成人a v视频| 久久久91精品国产| av一级亚洲| 欧美成人精品欧美一级乱| 中文字幕乱码一区二区免费| 国产一区二区三区三州| 欧美激情aaaa| 蜜桃a∨噜噜一区二区三区| 亚洲免费av一区二区三区| 中文字幕在线不卡| 乱精品一区字幕二区| 日本一本a高清免费不卡| 91麻豆精品国产91久久久平台| 91欧美一区二区三区| 亚洲成人av电影| 川上优的av在线一区二区| 91在线观看免费高清| 99精品视频免费| 波多野结衣家庭教师在线观看| 日韩精品中文字幕一区| 欧洲一级精品| av 日韩 人妻 黑人 综合 无码| 99久久伊人网影院| 97caocao| 2019中文在线观看| 在线电影一区二区| 一卡二卡三卡四卡| 日韩一区二区视频在线观看| 午夜欧美激情| 成人午夜免费剧场| 久久久99久久精品欧美| 精品国产av一区二区| 日本成人精品在线| 欧美大片专区| 免费看裸体网站| 亚洲福利在线视频| 99精品视频在线免费播放| 丰满少妇在线观看|