精品久久久久久久久中文字幕_成人在线免费观看视视频_成人久久精品视频_热99精品里视频精品_日韩国产欧美精品在线_色多多国产成人永久免费网站_国产一区二区三区18_日韩美女免费观看_亚洲va久久久噜噜噜_亚洲精品一区二区在线_亚洲福利视频在线_中文字幕亚洲情99在线_91精品久久久久久久久久久久久_欧美日韩成人在线观看_日本精品视频在线播放_97视频在线观看播放

二維碼
企資網(wǎng)

掃一掃關(guān)注

當前位置: 首頁 » 企業(yè)資訊 » 行業(yè) » 正文

一次程序優(yōu)化經(jīng)歷,運行8小時到3小時到50分

放大字體  縮小字體 發(fā)布日期:2021-09-14 04:28:56    作者:企資小編    瀏覽次數(shù):90
導(dǎo)讀

上周我遇到一個需要處理大文件的場景,需要遍歷大文件,并且對數(shù)據(jù)進行一定的處理。由于這批數(shù)據(jù)對時效性要求較高,所以當時我編寫的程序是希望運行地越快越好,所以我在編程的過程中對程序進行一次一次的優(yōu)化,最終

上周我遇到一個需要處理大文件的場景,需要遍歷大文件,并且對數(shù)據(jù)進行一定的處理。由于這批數(shù)據(jù)對時效性要求較高,所以當時我編寫的程序是希望運行地越快越好,所以我在編程的過程中對程序進行一次一次的優(yōu)化,最終從開始時需要運行8小時到現(xiàn)在只需運行50分鐘,算是達到了需求。當然,你可能會說一開始的程序?qū)懙锰珷€,所以導(dǎo)致運行太緊,無所謂啦,這并不是重點。實際上,很多人第一次寫程序都很難按預(yù)想那樣寫出簡單高效的代碼片段,只是有的場景對性能要求并不高,所以有的人看著自己的程序能運行后就不再進行優(yōu)化了。其實,絕大多數(shù)程序都是有優(yōu)化空間的,并且還有很大的優(yōu)化空間,這個空間指的是時間和空間。

廢話不多說,我把這次優(yōu)化的過程和思路總結(jié)為8個點,分享出來,希望能對大家有所幫助。

1 需求

大數(shù)據(jù)時代,處理大量數(shù)據(jù)成為了不少程序員的家常便飯。那么多大的數(shù)據(jù)可以稱為大數(shù)據(jù)呢?對于數(shù)據(jù)量,很難用一個確定的量去描述其界限,我理解大數(shù)據(jù)不僅僅是數(shù)據(jù)量大,還應(yīng)該具有數(shù)據(jù)復(fù)雜的特性,比如維度高、字段多。我平時處理的數(shù)據(jù)并不是大到磁盤都存不下那種,最多就是億的量級。此次處理的數(shù)據(jù)是一個文本的大文件,數(shù)據(jù)量不到一億,占用磁盤空間幾百GB,它是行列結(jié)構(gòu),即每一行數(shù)據(jù)用tab鍵分割,有不到100個字段,其中有部分字段是json,且這個json異常復(fù)雜,一條大的數(shù)據(jù)可能會占用好幾MB的空間。

我要做的事情很簡單,最費勁的就是在每一條數(shù)據(jù)的大json串中增加一個字段,這個字段經(jīng)過了一些復(fù)雜的計算。簡單來說就是寫程序遍歷一遍這個文件,然后對每條數(shù)據(jù)做一些計算,其中包含了把一個字段塞到大json串中。

2 Python

說到處理數(shù)據(jù),我個人覺得Python是最好用的,當然它最caodan的地方是對中文編碼不夠支持,不過這還算是一個可以克服的缺點。和往常一樣,我用Python編寫了一版,試著跑了一下數(shù)據(jù),大約每一萬條數(shù)據(jù)需要大約耗費5秒。算下來,大概需要跑8到10小時,這是不能接受的,所以我開始了一系列的優(yōu)化。

另外多說一點,我們在測試自己的程序的時候,并不用全量的數(shù)據(jù)去測,比如從正式數(shù)據(jù)中去head(Linux命令,可以取文件頭部的n行數(shù)據(jù))出200萬條數(shù)據(jù)來進行測試,跑完測試用例就可以大致估算出整個程序耗時了。

3 并發(fā)

因為程序中包含了一定的計算邏輯,即消耗CPU的邏輯片段(說個題外話,有的程序可能是計算型的,比較耗CPU,有的是內(nèi)存型的,比較耗內(nèi)存,還有些是IO型的,大多數(shù)情況下磁盤讀寫會成為瓶頸),可能是受之前慣性思維的影響,對于優(yōu)化的方法,我首先想到的就是增加程序的并發(fā),開多個線程,開多個進程。多線程最簡單,一是好實現(xiàn),二是代碼相對好控制。三下兩下把代碼改成了多線程,這里我使用的是線程池而不是每來一條數(shù)據(jù)新創(chuàng)建一個線程去處理它,這樣可以減少程序的運行時間。所謂線程池就是,事先,一般在程序啟動的時候先創(chuàng)建一定數(shù)量的線程,然后每次有處理需求時,就從線程池中撈一個線程來處理它,因為線程的創(chuàng)建和消亡是會消耗資源和時間的,所以,理論上,使用線程池就可以減少這部分創(chuàng)建和消亡的時間。

我一開始創(chuàng)建了8個線程,運行了一下,程序并沒有快多少,所以我又把線程數(shù)提到了16,最后提到了128,運行速度反而減慢了。還是因為慣性思維,因為Python的線程模型是N:1模型。所謂N:1模型就是所有線程都跑在了一個物理核上,不同線程實際上是在同一個核上頻繁切換。我認為多線程已經(jīng)把一個核給榨干了,要提升程序的運行速度只能采取多進程。如果在CPU相對空閑時,不同的進程幾乎是可以獨占不同的物理核的,準確來說就是切換不太頻繁,可以實現(xiàn)真正意義上的并發(fā)。說到多進程,對于處理大文件,程序運行最快的方法是將一個大文件按行平均切割成m份,然后開啟m個進程獨立地跑這些數(shù)據(jù)。不過按照之前的經(jīng)驗,使用Linux下的文件切割命令split來切割這么一個大文件,大概需要3個小時,這屬于程序員的額外時間消耗,所以我放棄了。我還是選擇了進程池,在程序啟動的時候主進程fork出許多子進程,即master/worker模式,并且自己實現(xiàn)了一個生產(chǎn)者消費者,否則任務(wù)等待隊列會被撐爆的。代碼寫好了以后,根據(jù)我的以往實驗,在開啟5個進程的時候程序運行得最快,并且總的運行時間是之前的80%左右。優(yōu)化效果并不好,因為進程池也會存在進程的切換,和真正獨立的進程是有區(qū)別的。這幾個進程不是一直在running狀態(tài),也是會經(jīng)歷進程的狀態(tài)切換,running、wait、ready等狀態(tài)。從8個小時縮短為6個多小時是遠遠不達標的,至少要在兩個小時內(nèi)才能接受。

4 瓶頸

瞎搞了這么久,我終于想著去理性地尋找瓶頸,一種最好的方式就是在程序運行的時候?qū)崟r監(jiān)控計算機的狀態(tài),比如大家熟知的命令top,第三方工具htop。我這里使用的是公司內(nèi)部的監(jiān)控工具,可以查看內(nèi)存、CPU、IO的實時狀態(tài)。還有另一種方式就是計算程序每個部分的耗時,如果你的程序封裝或者抽象得足夠好,我們是很容易計算某個代碼片段的耗時的,比如計算在程序流程中某個函數(shù)需要運行多長時間,我們只用在調(diào)用函數(shù)之前打印一下Unix時間戳,然后在函數(shù)運行結(jié)束的時候打印時間戳,最后做個差就能算出耗時了。所以說我們的程序要高內(nèi)聚、低耦合,這樣后期維護起來是很爽的。經(jīng)查看,我發(fā)現(xiàn),在單線程的情況下,每處理一萬條數(shù)據(jù)大致耗時5秒,其中計算只花費了不到一秒,中文編碼解碼耗時不到一秒,IO耗時差不多兩秒,其中最耗時的就是解大json(json的decode和encode的步驟),耗時兩秒多一點。通過監(jiān)控計算機狀態(tài),在程序運行的時候我讀寫的那塊磁盤的IO被打滿了,原因是服務(wù)器上還有很多其他進程在讀寫這塊磁盤。

所以這里有兩個優(yōu)化點,第一點就是優(yōu)化IO,第二點就是把大json解包封包的時間縮短。

5 換磁盤

說到IO,很多同學(xué)第一時間想到的就是換塊SSD。換塊SSD當然是個很好的解決辦法,但是如果每次編寫程序遇到IO問題都要通過硬件來優(yōu)化,公司豈不是得破產(chǎn)?程序員寫代碼并不是想要啥就有啥的,要用最小的預(yù)算達到目的。我所使用的服務(wù)器上并沒有掛載SSD磁盤,倒是掛載了很多機械盤,并且很多盤都沒有讀寫操作。在大多數(shù)情況下,我們所說的IO基本上都指的是某一塊磁盤的IO。這里有一個優(yōu)化點就是,我把讀寫的磁盤分離開,還是從之前的那塊磁盤讀數(shù)據(jù),但是往另外一塊磁盤寫數(shù)據(jù)。還是原來的單線程代碼,什么也沒有改變,程序的運行時間一下降低了四分之一。從8小時縮短為6小時。

6 算法

IO進行了一定的優(yōu)化,接下來就該優(yōu)化最耗時的json解包封包了。我使用的是Python的官方工具,json.loads和json.dumps。事實上,有時候官方的工具并不一定是最好的,就拿json處理的相關(guān)工具來說,同一種語言可能有很多不同的工具,它們的處理效率可能會相差10倍以上。接下來的操作是不是該換個json解包封包工具了?我并不想這么做,因為有更快的方式,不知道大家還記得我前文提到的一句話嗎?我是想在json串中增加一個字段,在多數(shù)情況下,增加比減少容易得多。既然是增加,那完全沒有必要解包,正常情況下,我們從文件中讀取的json串實際上是一個字符串,解包會把它變?yōu)橐粋€dict,處理完,又把這個dict轉(zhuǎn)化為一個字符串,然后再寫入文件。實際上,我們可以省略string轉(zhuǎn)dict再從dict轉(zhuǎn)string的步驟,因為json字符串的末尾是一個}符號,那么我們直接在}插入想要添加的字段即可。舉個例子:加入原始的json字符串是:{"key1":"value1"} ,我們想要加上一個字段key2,那么可以直接對字符串做切片操作(切片是Python中的一個操作)。即可以直接把這個過程變成 {"key1":"value1" + "key2":"value2" + }。這么一做,程序運行從之前的6小時縮短為3小時,處理時間減少了一倍,這算是在算法上的提升。

7 語言

3小時雖然已經(jīng)比最開始的8小時快很多了,但我還是嫌棄它太長。Python雖然比較適合處理數(shù)據(jù),寫起來也比較容易,不過比較偏上層,無法進行更底層的控制,比如內(nèi)存、線程、進程等。都說Go語言的運行效率接近C++,開發(fā)效率接近Python,所以我也準備嘗嘗鮮。Go語言是編譯型語言,并且其語言本身就支持進程線程等特性。當然,這里我并沒使用并發(fā),我只是用Go把之前的Python代碼重新寫了一遍,不過還是做了適當?shù)膬?yōu)化。

1. 為了讓IO充分使用,我將Python一行一行的讀寫改為了Go語言一塊一塊的讀寫,即之前是一次讀一行,現(xiàn)在是一次讀一塊固定大小的二進制,然后用換行符來區(qū)分這一塊里面的每一行,誰快誰慢一下就能見分曉。

2. 我給文件的讀寫各添加了一個30MB的緩存,構(gòu)成兩個生產(chǎn)者消費者。對寫操作來說,生產(chǎn)者是代碼處理邏輯,消費者是IO寫。經(jīng)測試,生產(chǎn)者的速度是快于消費者的(所以這里提高并發(fā)已經(jīng)沒有什么意義了,瓶頸在IO)。

在這種情況下,最后整個程序運行完成只需要50分鐘,已經(jīng)在兩個小時內(nèi)了,符合了最初的需求。

8 Todo

其實這個程序還有優(yōu)化的空間,因為已經(jīng)符合我最開始的需求,我就沒有繼續(xù)再優(yōu)化下去。我剛說到,程序的瓶頸在于IO寫。那么我們可以同時往掛載在同一臺機器上的多個磁盤循環(huán)寫,這樣就能分散每塊磁盤的IO了。不過,寫程序不能為了優(yōu)化而優(yōu)化,在開發(fā)效率和運行效率上我們要選擇一個折中點。再盲目繼續(xù)優(yōu)化,代碼的復(fù)雜度就該上升了。

 
(文/企資小編)
免責(zé)聲明
本文僅代表作發(fā)布者:企資小編個人觀點,本站未對其內(nèi)容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
 

Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

粵ICP備16078936號

微信

關(guān)注
微信

微信二維碼

WAP二維碼

客服

聯(lián)系
客服

聯(lián)系客服:

在線QQ: 303377504

客服電話: 020-82301567

E_mail郵箱: weilaitui@qq.com

微信公眾號: weishitui

客服001 客服002 客服003

工作時間:

周一至周五: 09:00 - 18:00

反饋

用戶
反饋

亚洲欧洲一二三| 山东少妇露脸刺激对白在线| 欧美日韩国产高清一区二区| 日本中文字幕一区二区有码在线| 99视频精品全部免费在线| 日本a级片久久久| 国内精品久久久久久久久蜜桃| 免费在线成人av| 蜜桃视频在线入口www| 欧美日韩高清一区二区三区| 久久精品视频播放| 麻豆91精品| 99在线热播精品免费| 亚洲最大色网站| 最新国产成人在线观看| 日韩精品视频一区二区三区| 欧美sm极限捆绑bd| 1769国内精品视频在线播放| 久久久av亚洲男天堂| 欧美91看片特黄aaaa| 国产一级在线观看视频| 亚洲天堂网在线视频| 有没有片在线看www| 国产欧美日韩第一页| 另类尿喷潮videofree| 奇米影视亚洲狠狠色| 欧美白人最猛性xxxxx| 欧美性受黑人性爽| 僵尸再翻生在线观看| 97国产精品免费视频| 国产在线欧美在线| 欧美一区二区网站| 久久影院一区| 亚洲美女在线免费观看| 久久久久av| 欧美1819sex性处18免费| 视频三区在线| 精品国产乱码久久久久| 日本黄网站色大片免费观看| 天天爽天天爽夜夜爽| 国产资源在线免费观看| 精品欠久久久中文字幕加勒比| 日韩美女一级视频| 1区2区3区精品视频| 亚洲承认视频| 久久91麻豆精品一区| 国产欧美一区二区精品忘忧草| 国产精品第3页| 国产成人精品亚洲线观看| 视频三区二区一区| 色欲av无码一区二区三区| 成人伊人222| 黄色a级在线观看| 在线免费观看一级片| 久久精品一区二区三区不卡牛牛| 久久久久午夜电影| 伊人开心综合网| 欧美成人伊人久久综合网| 插插插亚洲综合网| 人妻无码一区二区三区免费| 久久久久久久久久久影院| 国产私拍福利精品视频二区| 国产乱码精品一区二区三区精东| 久久国产精品网| 久久成人18免费观看| 99国产**精品****| 麻豆精品一区二区| 国产va免费精品高清在线| 欧美精品高清| 久久天天东北熟女毛茸茸| 国产精品裸体一区二区三区| 欧美色图一区二区三区| 4438x成人网最大色成网站| 天堂视频在线免费观看| 精品国产老师黑色丝袜高跟鞋| 国产精品毛片一区二区在线看| 国产精品二区在线| 日本午夜精品久久久| 老司机深夜福利在线观看| 欧美禁忌电影网| 国产激情自拍| 6080日韩午夜伦伦午夜伦| 在线日本高清免费不卡| 热草久综合在线| 中文av一区| 中文字幕欧美日本乱码一线二线| 日日噜噜夜夜狠狠| 国产日韩欧美精品在线观看| 久久一夜天堂av一区二区三区| av资源网在线观看| 精品一区毛片| 久久成人综合| 正在播放亚洲一区| 亚洲精品久久久久久宅男| 日本激情在线观看| 国产一区二区丝袜| 一本精品一区二区三区| 国产性xxxx18免费观看视频| 欧美日韩亚洲视频一区| 欧美亚洲一区二区三区四区| 欧美老女人性生活视频| 大地资源网在线观看免费官网| 波多野结衣在线网站| 人成免费电影一二三区在线观看| 国产精品久久久久久久久久妞妞| 日日夜夜精品| 日韩一区二区三区av| av中文字幕在线播放| 九色蝌蚪av新入口| 亚洲视频 欧洲视频| 国产精品久久久久无码av色戒| 日本免费在线播放| 国产色视频一区| 免费特级黄色片| 国产免费福利| 最新热久久免费视频| 热久久中文字幕| 国产成人精品白浆久久69| 成人亚洲视频| 精品久久久久国产| 成人黄色一级视频| 欧美一区国产一区| 一区二区三区四区在线| 欧美性色aⅴ视频一区日韩精品| 欧美美女在线直播| 青青草娱乐在线| 91 视频免费观看| 一区二区久久久久| 国产九色porny| 99久久久免费精品国产一区二区| 青青草国产成人av片免费| 欧美人妖视频| 国产精品日本精品| 久久久久久久久岛国免费| 国产精品一卡二卡三卡| 成人免费视频观看视频| 亚洲欧洲中文日韩久久av乱码| 91亚洲一区二区| jvid福利在线一区二区| 久久精品91| 国产精品黄色| 日本wwwwwwwzzzzz视频| 啦啦啦啦免费高清视频在线观看1| 亚洲www免费| 日本三级黄色大片| 日本不卡高清| 福利视频午夜| 亚洲国产精品欧美久久| 久久伊人亚洲| 天天射综合影视| 在线观看免费毛片| ●精品国产综合乱码久久久久| 亚洲男女av一区二区| xxxx日本少妇| 欧美性天天影院| √8天堂资源地址中文在线| 三级精品视频久久久久| 久久青草久久| 一区二区三区影院| 精品久久久久久久久国产字幕| 91高潮大合集爽到抽搐| 欧美色综合一区二区三区| 99热在线免费| 久久精品国产第一区二区三区| 女同性αv亚洲女同志| 亚洲天堂网站在线观看视频| 伊人狠狠色j香婷婷综合| 日韩视频一区在线观看| 国产激情在线观看| 精品高清视频| 丁香天五香天堂综合| 成人精品一区二区三区免费| 国产欧美视频一区二区三区| 精品三级在线观看| 娇妻被老王脔到高潮失禁视频| 国产一级免费黄色片| 国产欧美日韩精品高清二区综合区| 欧美高跟鞋交xxxxhd| 国产999精品久久久| 国产99久久久国产精品| 久久一区二区三区四区| 亚洲精品69| 欧美亚洲丝袜| 国产黄色片中文字幕| 99精品视频在线免费播放| 免费成人黄色网址| 国产一区二区三区四区五区传媒| 色婷婷一区二区三区四区| 爱情岛论坛亚洲品质自拍视频网站| 亚洲精品**中文毛片| 国产精品jk白丝蜜臀av小说| 亚洲日本乱码在线观看| 国产精品一区二区av| 欧美特级aaa| 久久爱www成人| 色婷婷久久99综合精品jk白丝| 国产精品每日更新在线播放网址| 亚洲黄色av网址| 老熟妇高潮一区二区高清视频| 天天综合天天| 一级片久久久久| 亚洲精品国产福利| 欧美色视频一区二区三区在线观看| 久久久之久亚州精品露出| eeuss影院在线播放| 91精品国产乱码久久蜜臀| h片在线观看视频免费| 国产伦精品一区二区三区四区视频| 日本在线www| 午夜电影网亚洲视频| 精品欧美一区二区精品少妇| 国产福利电影网| 欧美体内she精视频在线观看| 大又大又粗又硬又爽少妇毛片| 日韩乱码人妻无码中文字幕久久| 亚洲精品电影院| 国产精品美女久久久久av福利| 免费在线观看污视频| av激情久久| 青青热久免费精品视频在线18| www.日韩系列| 最后生还者第二季在线观看| 精品少妇久久久| caoporn-草棚在线视频最| 国产一区二区你懂的| 亚洲人成77777在线观看网| 欧美日韩国产综合在线| 91精品国产乱码久久| 午夜精品三级久久久有码| 国产乱码精品一区二区三区精东| 亚洲欧美日韩另类精品一区二区三区| 人体久久天天| 麻豆精品91| 美女视频黄免费的亚洲男人天堂| 999热视频| 亚洲人成在线观看| 免费在线观看a| sm在线播放| 不卡免费追剧大全电视剧网站| 亚洲精品免费在线视频| 国产乱码精品一区二区三区精东| 一级特黄aa大片| 福利视频在线看| 亚洲精品一区二区三区四区高清| 在线亚洲人成电影网站色www| 久久精品女人| 亚洲欧美国产视频| 天堂va欧美ⅴa亚洲va一国产| 浮力影院欧美三级日本三级| 久久久免费观看视频| 亚洲91中文字幕无线码三区| 欧美丰满老妇厨房牲生活| 亚洲毛片在线观看| 韩国美女主播一区| 欧美又大粗又爽又黄大片视频| 国产精品视频免费一区| 亚洲综合在线免费| 日韩和欧美一区二区三区| 亚洲精品在线视频免费观看| 日本www在线视频| 91久久在线观看| 欧美激情一级精品国产| 91在线国产福利| 郴州新闻综合频道在线直播| 久久久噜噜噜久噜久久综合| 国产精品福利网站| 久久黄色av网站| 在线观看日韩av电影| 男人天堂av在线播放| 亚洲av无码乱码国产精品| 国产精品久久久久婷婷二区次| 最近中文字幕一区二区三区| 无码国产伦一区二区三区视频| 亚洲热在线视频| 国产免费黄视频在线观看| 色噜噜日韩精品欧美一区二区| 免费麻豆国产一区二区三区四区| 亚洲作爱视频| 亚洲欧美日韩直播| 91蜜桃视频在线观看| 校园春色综合网| 国产v亚洲v天堂无码久久久| 久久亚洲天堂| a级黄色小视频| 99一区二区| 国产精品久久精品牛牛影视| 精品一区二区久久| 国产精品99精品| 亚洲精品中文字幕女同| 久久综合久久久| 蜜桃视频污在线观看| 欧美激情一区二区三区在线视频观看| 亚洲国产一区在线| 男人午夜视频| 国产精品chinese在线观看| 午夜丝袜av电影| 国产成人一级电影| 欧美一区二区视频在线观看2022| 中国日本在线视频中文字幕| 日韩精品在线影院| 国产在线免费视频| 日本成人精品视频| 午夜精品视频一区| 欧美中文字幕视频在线观看| 色屁屁草草影院ccyycom| 91精品欧美久久久久久动漫| 国产精品福利导航| 亚洲人成免费电影| 五月天婷婷在线观看| av亚洲精华国产精华| 日韩精品在线视频| aa日韩免费精品视频一| 黄色a级三级三级三级| 国产成人综合精品在线| 久久久久久久一区二区| 日本午夜在线亚洲.国产| 97av在线播放| 国产欧美综合在线| 制服国产精品| 久久国产精品影视| 亚洲天堂精品视频| 亚洲一级黄色| 九九精品在线播放| 91精品国产乱码久久久久久蜜臀| 粉嫩小泬无遮挡久久久久久| 韩国美女主播一区| 欧洲视频一区二区| 99久久一区三区四区免费|