現在的數據科學比賽提供的數據量越來越大,動不動幾十個G,甚至上百G,這就要考驗機器性能和數據處理能力。
Python中的pandas是大家常用的資料處理工具,能應付較大資料集(千萬行級別),但當資料量達到十億百億行級別,pandas處理起來就有點力不從心了,可以說非常的慢。
這裡面會有電腦記憶體等效能的因素,但pandas本身的資料處理機制(依賴記憶體)也限制了它處理大數據的能力。
當然pandas可以透過chunk分批讀取數據,但這樣的劣勢在於數據處理較複雜,每一步分析都會消耗記憶體和時間。
下面用pandas讀取3.7個G的資料集(hdf5格式),該資料集共有4列、1億行,並且計算第一行的平均值。我的電腦CPU是i7-8550U,記憶體8G,看看這個載入和運算過程需要花費多少時間。
資料集:
使用pandas讀取並計算:
##看上面的過程,載入數據花了15秒,平均值計算花了3.5秒,總共18.5秒。 這裡用的是hdf5文件,hdf5是一種文件儲存格式,相比較csv更適合儲存大數據量,壓縮程度高,而且讀取、寫入也更快。 換上今天的主角vaex,讀同樣的數據,做同樣的平均值計算,需要花多少時間呢? 使用vaex讀取並計算: 檔案讀取用了9ms,可以忽略不計,平均值計算用了1s,總共1s。 同樣是讀取1億行的hdfs資料集,為什麼pandas需要十幾秒,而vaex耗費時間接近0呢? 這裡主要是因為pandas把資料讀取到了記憶體中,然後用於處理和計算。而vaex只會對資料進行記憶體映射,而不是真的讀取資料到記憶體中,這個和spark的懶載入是一樣的,在使用的時候 才會去加載,宣告的時候不載入。 所以說不管載入多大的數據,10GB、100GB...對vaex來說都是瞬間搞定。美中不足的是,vaex的懶加載只支援HDF5, Apache Arrow,Parquet, FITS等文件,不支援csv等文字文件,因為文字文件沒辦法進行記憶體映射。 可能有的小夥伴不太理解記憶體映射,下面放一段解釋,具體要弄清楚還得自行摸索:記憶體映射是指硬碟上檔案的位置與行程邏輯位址空間中一塊大小相同的區域之間的一一對應。這種對應關係純屬是邏輯上的概念,物理上是不存在的,原因是流程的邏輯位址空間本身就是不存在的。在記憶體映射的過程中,並沒有實際的資料拷貝,檔案沒有被載入內存,只是邏輯上被放入了內存,具體到程式碼,就是建立並初始化了相關的資料結構(struct address_space)。 什麼是vaex前面比較了vaex和pandas處理大數據的速度,vaex優勢明顯。雖然能力出眾,不比pandas家喻戶曉,vaex還是個剛出圈的新人。 vaex同樣是基於python的資料處理第三方函式庫,使用pip就可以安裝。
有時候我們需要對資料進行各種各樣的轉換、篩選、計算等,pandas的每一步處理都會消耗內存,而且時間成本高。除非說使用鍊式處理,但那樣過程就很不清晰。
vaex則全過程都是零記憶體。因為它的處理過程只是產生expression(表達式),表達式是邏輯表示,不會執行,只有到了最後的生成結果階段才會執行。而且整個過程資料是串流,不會產生記憶體積壓。
可以看到上面有篩選和計算兩個過程,都沒有複製內存,這裡採用了延遲計算,也就是惰性機制。如果每個過程都真實計算,消耗記憶體不說,單是時間成本就很大。
vaex的統計計算函數:
vaex還可以進行快速視覺化展示,即使是數百億的數據集,依然能秒出圖。
vaex視覺化函數:
vaex有點類似spark和pandas的結合體,數據量越大越能體現它的優勢。只要你的硬碟能裝下多大數據,它就能快速分析這些數據。
vaex還在快速發展中,整合了越來越多pandas的功能,它在github上的star數是5k,成長潛力巨大。
附:hdf5資料集產生程式碼(4列1億行資料)
import pandas as pd import vaex df = pd.DataFrame(np.random.rand(100000000,4),columns=['col_1','col_2','col_3','col_4']) df.to_csv('example.csv',index=False) vaex.read('example.csv',convert='example1.hdf5')
#注意這裡不要用pandas直接產生hdf5,其格式會與vaex不相容。
以上是Python Vaex如何實現快速分析100G大數據量的詳細內容。更多資訊請關注PHP中文網其他相關文章!