對於我這個經常用python倒騰數據的人來說,下面這個庫是真·相見恨晚
記得有一次我在服務器上處理數據時,為了解決Pandas讀取超過2000W條數據就內存爆炸的問題,整整用了兩天時間來優化。最后通過數據轉換,數據類型,迭代讀取和GC機制解決了(具體方法在我的博客:Python優化之使用pandas讀取和訓練千萬級數據)
我一直覺得python處理大規模數據是真的不行,除非上Hadoop。直到我看到了一個叫Modin的庫,才知道什么叫一行代碼,解決所有問題。
先說說為啥pandas這么不好用
Pandas 是Python中常用的程序庫,計算機、數據科學領域的應該都經常用。本身它是個高性能、易於使用的數據結構和數據分析工具,可以說非常新手友好了。但是當數據量一旦變大時,單個內核上運行的 Pandas 就會變得力不從心,畢竟現在企業級數據單日數據量可能都是GB或者TB數量級,可能會需要分布式系統來提高性能。在默認設置下,Pandas只使用單個CPU內核,在單進程模式下運行函數,相比之下Tensorflow只需要設置GPU參數就可以多核並行了。
速度慢並不會影響小型數據,我們甚至可能都不會注意到速度的變化。但對於計算量龐大的數據集來說,僅使用單內核會導致運行速度非常緩慢。有些數據集可能有百萬條甚至上億條數據,如果每次都只進行一次運算,只用一個CPU,速度會很慢。
絕大多數現代電腦都有至少兩個CPU。但即便是有兩個CPU,使用pandas時,受默認設置所限,一半甚至以上的電腦處理能力無法發揮。如果是4核(現代英特爾i5芯片)或者6核(現代英特爾i7芯片),就更浪費了。Pandas本就不是為了高效利用電腦計算能力而設計的。
所以從我們只是想讓 Pandas 運行得更快,而不是為了特定的硬件設置而優化其工作流。這意味着我們希望在處理 10KB 的數據集時,可以使用與處理 10TB 數據集時相同的 Pandas 腳本。Modin 提供了一個優化 Pandas 的解決方案,這樣數據科學工作者就可以把時間花在從數據中提取價值上,而不是花在提取數據的工具上。
啥是Modin?
Modin 是加州大學伯克利分校 RISELab 的一個早期項目,旨在促進分布式計算在數據科學領域的應用。它是一個多進程的數據幀(Dataframe)庫,具有與 Pandas 相同的應用程序接口(API),使用戶可以加速他們的 Pandas 工作流。
它是一個多進程的數據幀(Dataframe)庫,具有與 Pandas 相同的應用程序接口(API),使用戶可以加速他們的 Pandas 工作流。據相關實驗表明,在一台 8 核的機器上,用戶只需要修改一行代碼,Modin 就能將 Pandas 查詢任務加速 4 倍。
在Pandas中,給定DataFrame,目標是盡可能以最快速度來進行數據處理。可以使用.mean()來算出每行的平均數,用groupby將數據分類,用drop_duplicates()來刪除重復項,還有很多Pandas的其他內置函數以供使用。
之前提到,Pandas只調用一個CPU來進行數據處理。這是一個很大的瓶頸,特別是對體量更大的DataFrames,資源的缺失更加突出。
理論上來講,並行計算就如同在所有可用CPU內核中的不同數據點中計算一樣簡單。之於Pandas DataFrame,一個基本想法就是根據不同的CPU內核數量將DataFrame分成幾個不同部分,讓每個核單獨計算。最后再將結果相加,這在計算層面來講,運行成本比較低。
如何提高多核系統數據處理速度。在單核系統處理過程中(左),所有10個任務都用一個CPU處理。而在雙核系統中(右),每個節點處理5個任務,處理速度提高一倍。
這其實也就是Modin的原理,將 DataFrame分割成不同的部分,而每個部分由發送給不同的CPU處理。Modin可以切割DataFrame的橫列和縱列,任何形狀的DataFrames都能平行處理。
假如拿到的是很有多列但只有幾行的DataFrame。一些只能對列進行切割的庫,在這個例子中很難發揮效用,因為列比行多。但是由於Modin從兩個維度同時切割,對任何形狀的DataFrames來說,這個平行結構效率都非常高。不管有多少行,多少列,或者兩者都很多,它都能游刃有余地處理。
Pandas DataFrame(左)作為整體儲存,只交給一個CPU處理。ModinDataFrame(右)行和列都被切割,每個部分交給不同CPU處理,有多少CPU就能處理多少個任務。
上述圖像只是一個簡單的例子。Modin通常會用到一個分盤助手(Partition Manager),它能根據操作的種類改變分盤的大小和形狀。比如說,可能需要一整行或者一整列(數據)的操作。在這種情況下,分盤助手就能對任務進行切割,再分別交給不同的CPU處理,從而找到任務處理的最優解,靈活方便。
在並行處理時,Modin會從Dask或者Ray工具中任選一個來處理繁雜的數據,這兩個工具都是PythonAPI的平行運算庫,在運行Modin的時候可以任選一個。目前為止,Ray應該最為安全且最穩定。Dask后端還處在測試階段。
該系統是為希望程序運行得更快、伸縮性更好,而無需進行重大代碼更改的 Pandas 用戶設計的。這項工作的最終目標是能夠在雲環境中使用 Pandas。
讀取800M文件、以及對其進行各種PD操作速度對比
Modin 項目仍處於早期階段,但對 Pandas 來說是一個非常有發展前景的補充庫。Modin 為用戶處理所有的數據分區和重組任務,這樣我們就可以集中精力處理工作流。Modin 的基本目標是讓用戶能夠在小數據和大數據上使用相同的工具,而不用考慮改變 API 來適應不同的數據規模。
在這個示例中,我們通過使用Modin,讀取這個800M文件大約節省了22秒,相當於節省了74%的時間。試想一下如果有100個這樣的文件需要讀取,光讀取文件就可以節省半個小時的時間。
安裝方法
pip install 大法(記得裝RAY)
使用方法
import modin.pandas as pd
更多python技能、機器學習、AI知識,歡迎關注我的公眾號「圖靈的貓」,后台回復SSR有機場節點相送哦~