我有一個非常大的 JSONL 檔案(14GiB,1200 萬行),其中包含世界各地的雷擊記錄。我想要做的是完善這個資料集,以便只有發生在德國的雷擊留在最后。檔案的每一行都包含一個“strokes”串列,其中包含許多 JSON 物件(閃電)。它看起來像這樣:
"strokes": [
{
"time": 1624230617044,
"lat": 64.298728,
"lon": 44.536694,
"src": 2,
"srv": 2,
"id": 42243883,
"del": 1887,
"dev": 1941
}, #... other items
]
如您所見,由于只給出了緯度和經度,因此人們不知道雷擊發生在哪個國家/地區。人們必須使用reverse_geocoder圖書館才能將一組特定的坐標映射到該國家/地區。該方法可以如下使用:
rg.search(strike_location) # strike_location is a tuple that holds the gps coordinate
該方法的輸出是一個 json 物件,其中包含該國家/地區的 ISO 代碼,“DE”代表德國。實作此任務的一種方法是逐行遍歷檔案并過濾資料,結果對reverse_geocoder庫的一個查詢需要大約。1.5sc 才能完成,這使得這種方法真的很慢。
我想到的另一種方法是將檔案分成幾部分并將每個部分分配給一個特定的行程,假設有 16 個部分,所以我將創建 16 個行程,因為我的機器上有 16 個 CPU。如果這種方法是可能的,那怎么做呢?或者,如果您有某種方法可以改進第一種方法,那將對我有很大幫助。
uj5u.com熱心網友回復:
首先,我假設位置查找是一個網路請求。并行執行這些操作根本不需要太多 CPU,因為它不受 CPU 的限制,而是取決于您發送請求的速度、讓服務處理它們并將回應回傳給您。因此,簡而言之,有用的并行請求數量與您的 CPU 內核數量無關。
現在,對于對 Web 服務的并行請求,您不需要多個行程。使用例如執行緒就足夠了,但是如果發出請求的模塊提供并行請求支持,您甚至可以不用自己進行執行緒處理。
也就是說,德國在地理上非常受限制。按最小/最大緯度和經度做一個簡單的過濾器可能已經減少了很多候選者的數量。考慮這樣做,特別是如果進行地理映射的服務是免費的,因為您不想濫用他們的資源!
uj5u.com熱心網友回復:
我認為使用Dask https://docs.dask.org/en/stable/會很有用
只需使用dask.dataframe.read_json方法。
另外 Dask 支持多處理,即使是大檔案,您也不必擔心,因為 Dask 使用延遲加載。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/364372.html
