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

Python中最快解壓zip文件的方法

開發 后端
挑戰在于這些 zip 文件太大了。它們的平均大小是 560MB 但是其中一些大于 1GB。這些文件中大多數是文本文件,但是其中同樣也有一些巨大的二進制文件。不同尋常的是,每個 zip 文件包含 100 個文件但是其中 1-3 個文件卻占據了多達 95% 的 zip 文件大小。

[[220979]]

假設現在的上下文(LCTT 譯注:context,計算機術語,此處意為業務情景)是這樣的:一個 zip 文件被上傳到一個Web 服務中,然后 Python 需要解壓這個 zip 文件然后分析和處理其中的每個文件。這個特殊的應用查看每個文件各自的名稱和大小,并和已經上傳到 AWS S3 上的文件進行比較,如果文件(和 AWS S3 上的相比)有所不同或者文件本身更新,那么就將它上傳到 AWS S3。

Uploads today

Uploads today

挑戰在于這些 zip 文件太大了。它們的平均大小是 560MB 但是其中一些大于 1GB。這些文件中大多數是文本文件,但是其中同樣也有一些巨大的二進制文件。不同尋常的是,每個 zip 文件包含 100 個文件但是其中 1-3 個文件卻占據了多達 95% 的 zip 文件大小。

最開始我嘗試在內存中解壓文件,并且每次只處理一個文件。在各種內存爆炸和 EC2 耗盡內存的情況下,這個方法壯烈失敗了。我覺得這個原因是這樣的。最開始你有 1GB 文件在內存中,然后你現在解壓每個文件,在內存中大約就要占用 2-3GB。所以,在很多次測試之后,解決方案是將這些 zip 文件復制到磁盤上(在臨時目錄 /tmp 中),然后遍歷這些文件。這次情況好多了但是我仍然注意到了整個解壓過程花費了巨量的時間。是否可能有方法優化呢?

 

原始函數

首先是下面這些模擬對 zip 文件中文件實際操作的普通函數:

  1. def _count_file(fn):
  2. with open(fn, 'rb') as f:
  3. return _count_file_object(f)
  4.  
  5. def _count_file_object(f):
  6. # Note that this iterates on 'f'.
  7. # You *could* do 'return len(f.read())'
  8. # which would be faster but potentially memory
  9. # inefficient and unrealistic in terms of this
  10. # benchmark experiment.
  11. total = 0
  12. for line in f:
  13. total += len(line)
  14. return total

這里是可能最簡單的另一個函數:

  1. def f1(fn, dest):
  2. with open(fn, 'rb') as f:
  3. zf = zipfile.ZipFile(f)
  4. zf.extractall(dest)
  5.  
  6. total = 0
  7. for root, dirs, files in os.walk(dest):
  8. for file_ in files:
  9. fn = os.path.join(root, file_)
  10. total += _count_file(fn)
  11. return total

如果我更仔細地分析一下,我將會發現這個函數花費時間 40% 運行 extractall,60% 的時間在遍歷各個文件并讀取其長度。

 

***步嘗試

我的***步嘗試是使用線程。先創建一個 zipfile.ZipFile 的實例,展開其中的每個文件名,然后為每一個文件開始一個線程。每個線程都給它一個函數來做“實質工作”(在這個基準測試中,就是遍歷每個文件然后獲取它的名稱)。實際業務中的函數進行的工作是復雜的 S3、Redis 和 PostgreSQL 操作,但是在我的基準測試中我只需要制作一個可以找出文件長度的函數就好了。線程池函數:

  1. def f2(fn, dest):
  2.  
  3. def unzip_member(zf, member, dest):
  4. zf.extract(member, dest)
  5. fn = os.path.join(dest, member.filename)
  6. return _count_file(fn)
  7.  
  8. with open(fn, 'rb') as f:
  9. zf = zipfile.ZipFile(f)
  10. futures = []
  11. with concurrent.futures.ThreadPoolExecutor() as executor:
  12. for member in zf.infolist():
  13. futures.append(
  14. executor.submit(
  15. unzip_member,
  16. zf,
  17. member,
  18. dest,
  19. )
  20. )
  21. total = 0
  22. for future in concurrent.futures.as_completed(futures):
  23. total += future.result()
  24. return total

結果:加速 ~10%

 

第二步嘗試

所以可能是 GIL(LCTT 譯注:Global Interpreter Lock,一種全局鎖,CPython 中的一個概念)阻礙了我。最自然的想法是嘗試使用多線程在多個 CPU 上分配工作。但是這樣做有缺點,那就是你不能傳遞一個非可 pickle 序列化的對象(LCTT 譯注:意為只有可 pickle 序列化的對象可以被傳遞),所以你只能發送文件名到之后的函數中:

  1. def unzip_member_f3(zip_filepath, filename, dest):
  2. with open(zip_filepath, 'rb') as f:
  3. zf = zipfile.ZipFile(f)
  4. zf.extract(filename, dest)
  5. fn = os.path.join(dest, filename)
  6. return _count_file(fn)
  7.  
  8.  
  9.  
  10. def f3(fn, dest):
  11. with open(fn, 'rb') as f:
  12. zf = zipfile.ZipFile(f)
  13. futures = []
  14. with concurrent.futures.ProcessPoolExecutor() as executor:
  15. for member in zf.infolist():
  16. futures.append(
  17. executor.submit(
  18. unzip_member_f3,
  19. fn,
  20. member.filename,
  21. dest,
  22. )
  23. )
  24. total = 0
  25. for future in concurrent.futures.as_completed(futures):
  26. total += future.result()
  27. return total

結果: 加速 ~300%

 

這是作弊

使用處理器池的問題是這樣需要存儲在磁盤上的原始 .zip 文件。所以為了在我的 web 服務器上使用這個解決方案,我首先得要將內存中的 zip 文件保存到磁盤,然后調用這個函數。這樣做的代價我不是很清楚但是應該不低。

好吧,再翻翻看又沒有損失。可能,解壓過程加速到足以彌補這樣做的損失了吧。

但是一定記住!這個優化取決于使用所有可用的 CPU。如果一些其它的 CPU 需要執行在 gunicorn 中的其它事務呢?這時,這些其它進程必須等待,直到有 CPU 可用。由于在這個服務器上有其他的事務正在進行,我不是很確定我想要在進程中接管所有其他 CPU。

 

結論

一步一步地做這個任務的這個過程感覺挺好的。你被限制在一個 CPU 上但是表現仍然特別好。同樣地,一定要看看在f1f2 兩段代碼之間的不同之處!利用 concurrent.futures 池類你可以獲取到允許使用的 CPU 的個數,但是這樣做同樣給人感覺不是很好。如果你在虛擬環境中獲取的個數是錯的呢?或者可用的個數太低以致無法從負載分配獲取好處并且現在你僅僅是為了移動負載而支付營運開支呢?

我將會繼續使用 zipfile.ZipFile(file_buffer).extractall(temp_dir)。這個工作這樣做已經足夠好了。

 

想試試手嗎?

我使用一個 c5.4xlarge EC2 服務器來進行我的基準測試。文件可以從此處下載:

  1. wget https://www.peterbe.com/unzip-in-parallel/hack.unzip-in-parallel.py
  2. wget https://www.peterbe.com/unzip-in-parallel/symbols-2017-11-27T14_15_30.zip

這里的 .zip 文件有 34MB。和在服務器上的相比已經小了很多。

hack.unzip-in-parallel.py 文件里是一團糟。它包含了大量可怕的修正和丑陋的代碼,但是這只是一個開始。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2015-04-08 15:40:53

php在線解壓解壓zip文件

2021-05-08 00:00:27

JavaScript ZIP文件

2021-12-10 15:22:26

Go Zip 文件

2019-10-17 17:15:01

Linux解壓文件命令

2011-08-15 14:07:53

Objective-C解壓縮ZIP文件

2011-12-30 11:14:41

Javazip

2020-09-09 14:30:24

2012-05-10 09:43:28

2020-12-21 16:00:07

Pythonzip文件密碼

2012-12-26 09:31:44

C#Winform

2013-06-13 09:12:07

LinuxLinux技巧海量文件

2024-06-20 08:09:24

2011-04-06 16:05:29

SQL Server數據導入

2009-03-22 19:19:15

多核多核服務器多核歷史

2020-12-13 17:57:16

加密密碼Python

2025-02-21 10:46:16

JSForEachAPI

2024-09-26 12:33:29

JSAPI循環

2025-09-26 03:00:00

JSAPIfor 循環

2018-07-05 11:05:10

2023-12-21 07:30:36

PythonZipfileTarfile
點贊
收藏

51CTO技術棧公眾號

国产精品网址在线| 亚洲欧美国产视频| 成人性生活视频免费看| 午夜一区在线观看| 日本特黄久久久高潮| 中文字幕一区日韩电影| 韩国三级与黑人| 亚洲欧美小说色综合小说一区| 欧美国产一区视频在线观看| 91在线中文字幕| 日韩在线视频免费播放| 清纯唯美亚洲综合一区| 精品黑人一区二区三区久久| 日韩精品免费播放| 日本一级理论片在线大全| 99riav久久精品riav| 国产九九精品视频| 久久夜靖品2区| 图片区亚洲欧美小说区| 精品夜色国产国偷在线| 两女双腿交缠激烈磨豆腐| 天堂av中文在线观看| 亚洲欧美激情小说另类| 欧美日韩免费观看一区| 性色av蜜臀av| 蜜臀av在线播放一区二区三区| 高清欧美一区二区三区| 看黄色录像一级片| 国产一区二区三区不卡视频网站| 日韩欧美视频在线| 亚洲成人福利在线观看| 男人久久天堂| 一区二区三区久久| 一区二区三区久久网| 久草在线免费福利资源| 成人网在线免费视频| 国产精品视频在线观看| 国产在线观看黄色| 伊人激情综合| 欧美另类极品videosbest最新版本| 少妇无套高潮一二三区| 亚州国产精品| 日韩成人免费视频| 精品无码人妻少妇久久久久久| 欧美一级在线| 欧美色涩在线第一页| 久久久999免费视频| 91九色在线播放| 一二三四社区欧美黄| 免费观看黄色的网站| 淫片在线观看| 日本一区二区在线不卡| 欧美日韩电影一区二区三区| 亚洲 另类 春色 国产| 国产91精品久久久久久久网曝门| 91视频国产高清| 国产精品欧美亚洲| 精品一区二区久久| 91网站免费看| www.成人在线观看| 国产激情91久久精品导航 | 欧美日韩天天操| 天堂成人在线观看| thepron国产精品| 国内精品视频免费| 欧美欧美欧美| 国产嫩草影院久久久久| 亚洲在线观看一区| av在线下载| 亚洲综合无码一区二区| 日韩亚洲欧美视频| 一区二区三区电影大全| 91成人免费在线视频| 天天爽夜夜爽一区二区三区| 日韩综合av| 91精品国产综合久久精品| japan高清日本乱xxxxx| 风间由美一区二区av101| 亚洲精品www| 欧洲美一区二区三区亚洲| 精品久久久久久久| 精品国产欧美一区二区三区成人| 欧美色图亚洲天堂| 在线亚洲自拍| 国产欧美日韩中文字幕| 精品人妻一区二区三区蜜桃| 99久久精品免费| 日本在线观看一区二区| 成人av黄色| 午夜国产精品一区| 天堂中文视频在线| 91精品短视频| 亚洲一二在线观看| 91成人福利视频| 亚洲一区二区成人| 91免费在线视频网站| 婷婷久久久久久| 国产精品免费免费| 国产二级片在线观看| 91tv亚洲精品香蕉国产一区| 日韩精品专区在线影院观看| www.中文字幕av| 影音先锋成人在线电影| 欧美一区二区色| 国产日韩精品suv| 久久综合视频网| 免费的av在线| 亚洲第一会所| 亚洲黄页视频免费观看| 国产人与禽zoz0性伦| 99精品国产在热久久| 成人在线视频网站| 国产在线视频网站| 亚洲一卡二卡三卡四卡五卡| 久久婷婷综合色| 日韩av网址大全| 欧美不卡视频一区发布| 日本丰满少妇做爰爽爽| 成人高清视频在线观看| 制服国产精品| 成人在线网站| 日韩av一卡二卡| 久久久久久久久久久久久久久久久| 日本在线不卡视频一二三区| 激情视频一区二区| 色帝国亚洲欧美在线| 欧美日韩大陆在线| 高潮毛片无遮挡| 99国产精品视频免费观看一公开 | 91丨porny丨在线中文 | 日韩高清在线播放| 极品av在线| 精品88久久久久88久久久| 影音先锋男人资源在线观看| 日韩中文字幕av电影| 久久精品人成| 超碰激情在线| 亚洲精品99久久久久| 豆国产97在线 | 亚洲| 国产福利一区二区| 路边理发店露脸熟妇泻火| 亚洲色图综合| 久久久91精品| 国产青青草视频| 中文字幕一区av| 91丨九色丨蝌蚪| 97精品中文字幕| 成人午夜在线观看| 国产福利在线播放麻豆| 91麻豆精品国产自产在线| 人人澡人人澡人人看| 久久99久久99| 亚洲最新免费视频| 国产一区二区三区| 久久国产精品久久久久久久久久| 国产男男gay体育生网站| 亚洲四区在线观看| 人妻精品久久久久中文字幕69| 欧美一区不卡| 成人自拍爱视频| 免费毛片在线看片免费丝瓜视频| 欧美一级片免费看| 久久精品美女视频| 91亚洲资源网| 无人在线观看的免费高清视频| 精品国产一区二区三区小蝌蚪| 国产精品91免费在线| 丝袜美腿美女被狂躁在线观看| 欧美精三区欧美精三区| www.99re7| 97久久人人超碰| mm1313亚洲国产精品无码试看| 日韩久久综合| 99一区二区三区| 欧美久久天堂| 自拍视频国产精品| 精品人妻少妇AV无码专区| 亚洲成人你懂的| 日韩乱码人妻无码中文字幕久久 | 色偷偷中文字幕| 国产精品mm| 欧美一区二区三区在线免费观看 | 欧美色涩在线第一页| 麻豆视频在线观看| 91天堂素人约啪| 黄色小视频免费网站| 国产中文一区| 欧美日韩综合另类| 欧美1区2区3| 欧洲亚洲妇女av| 国产乱色在线观看| 日韩电影免费在线观看中文字幕| 在线免费av网| 亚洲国产精品尤物yw在线观看| 中字幕一区二区三区乱码| 国产精品综合在线视频| 东京热加勒比无码少妇| 91精品国产视频| 女同一区二区| 日韩在线精品强乱中文字幕| 青青草精品毛片| 中文字幕伦理免费在线视频| 亚洲人成在线观| а√中文在线资源库| 91国偷自产一区二区三区观看 | 韩日成人在线| 色婷婷精品国产一区二区三区| 欧美一区在线观看视频| 国产精品久久久久福利| rebdb初裸写真在线观看| 久久精品国产久精国产一老狼| 视频在线不卡| 日韩一区二区高清| 中文字幕免费在线看| 欧美日韩国产麻豆| 久久久久久久久久99| 亚洲欧洲日产国码二区| 中文字幕一二三四区| 国产aⅴ综合色| 亚洲另类第一页| 天堂资源在线中文精品| 国自产拍偷拍精品啪啪一区二区 | www久久久久| 亚洲AV成人精品| 狠狠v欧美v日韩v亚洲ⅴ| 看欧美ab黄色大片视频免费| 欧美精品国产一区二区| 无码免费一区二区三区免费播放| 九九热播视频在线精品6| 亚洲已满18点击进入在线看片| 成人网ww555视频免费看| 韩国一区二区电影| 成年网站在线视频网站| 九九热精品在线| 91高清在线观看视频| xvideos亚洲| 麻豆视频在线观看免费| 中文字幕国内精品| 北岛玲一区二区三区| 国产亚洲精品美女| 国产精品免费播放| 国产亚洲精品久久久| 国产系列在线观看| 一区二区欧美在线| 97电影在线看视频| 综合网中文字幕| www.91在线| 亚洲三级免费看| 成a人片在线观看www视频| 亚洲人成电影网站色…| 国产天堂素人系列在线视频| 亚洲欧美精品伊人久久| 国产污视频在线| www.亚洲天堂| 污网站在线免费看| 久久久久久九九九| 爱啪啪综合导航| 青草成人免费视频| 日本黄色一区| 成人激情免费在线| 亚洲免费一区三区| 久久草视频在线看| 狠狠综合久久av一区二区蜜桃| 日韩欧美99| 亚洲草久电影| 黄色大片中文字幕| 先锋亚洲精品| 国产免费又粗又猛又爽| 久久99深爱久久99精品| 日本精品一二三| 91在线视频网址| 色www亚洲国产阿娇yao| 日韩久久一区二区| 日韩精品一区二区在线播放 | 久久大胆人体视频| 欧美性xxxx69| 99精品视频在线观看播放| 韩国无码av片在线观看网站| 一区二区三区国产盗摄| 人人干人人视频| 国产精品538一区二区在线| 北岛玲一区二区| 国产精品免费观看视频| 精品视频在线观看免费| 在线国产电影不卡| 国产成人精品毛片| 日韩高清中文字幕| 黄视频在线观看网站| 91成人国产在线观看| 国产激情欧美| 国产伦精品一区二区三区视频黑人| 一道在线中文一区二区三区| 在线一区亚洲| 免费视频一区| 无码人妻少妇色欲av一区二区| 91网站黄www| 裸体武打性艳史| 色综合久久久久综合体桃花网| 国产精品综合在线| 日韩毛片在线观看| av官网在线播放| 国产精品久久久久久五月尺| 午夜日韩影院| 亚洲欧洲中文| 国产亚洲精品bv在线观看| 小早川怜子一区二区三区| 91在线播放网址| 精品在线免费观看视频| 欧美日韩大陆在线| 国产小视频福利在线| 韩国v欧美v日本v亚洲| 国产专区精品| 新呦u视频一区二区| 性欧美长视频| 最新版天堂资源在线| 中文字幕一区视频| 亚洲精品国产欧美在线观看| 亚洲国产精久久久久久 | 亚洲精品手机在线观看| 久久综合五月天婷婷伊人| 日本一区二区欧美| 日韩欧美色综合网站| 成人在线播放免费观看| 国产视频999| 国产一区二区三区四区二区 | 波多野结衣亚洲色图| 欧美日韩一卡二卡| 久久久久久久久亚洲精品| 77777少妇光屁股久久一区| 东京久久高清| 日韩黄色片在线| 国产成人精品一区二区三区四区 | 国产精品欧美在线| 精品产国自在拍| 黄色av免费在线播放| 91免费国产在线| 国产成人无码精品久久久久| 欧美精品一区二区三区四区| 日韩av毛片| 国产成人av一区二区三区| 欧美激情第二页| 免费黄色a级片| 亚洲电影在线播放| 日本激情一区二区三区| 亚洲18私人小影院| 任你躁在线精品免费| 97视频在线免费播放| 久久久另类综合| 黄色av网站免费观看| 亚洲色图日韩av| 欧美www.| 亚洲午夜在线观看| 国产在线精品免费av| 国产极品美女在线| 欧美变态tickling挠脚心| 久草在线视频网站| 精品无码久久久久国产| 国产亚洲一区在线| 中文字幕成人动漫| 欧美美女视频在线观看| 久久bbxx| 国产成人av一区二区三区| 亚洲激情国产| 美女被到爽高潮视频| 欧美色欧美亚洲另类二区| www.久久ai| 国产日产精品一区二区三区四区| 国产亚洲福利| 日韩一区二区三区四区视频| 日韩一区二区在线观看视频| heyzo中文字幕在线| 欧美伦理一区二区| 激情六月婷婷综合| 国产亚洲欧美精品久久久www| 日韩高清免费在线| 日韩综合av| 久无码久无码av无码| 久久综合九色综合欧美就去吻| 中文在线免费看视频| 欧美成人精品在线| 亚州av一区| 992kp免费看片| 精品国产户外野外| 毛片网站在线免费观看| 国产欧美韩日| 蜜桃精品视频在线观看| 豆国产97在线 | 亚洲| 国产亚洲欧洲黄色| 一区二区三区国产好| 苍井空浴缸大战猛男120分钟| 国产精品久久久久aaaa| 欧美一级免费片| 国产精品美女久久久久久免费| 欧美日韩在线大尺度| 加勒比综合在线| 精品国产乱码久久久久久免费| 日韩和的一区二在线| 成品人视频ww入口| 亚洲欧美在线另类| 黄色软件在线|