簡體   English   中英

在 Pandas 中存儲 MongoDB ObjectID

[英]Storing MongoDB ObjectID's in Pandas

從 MongoDB 檢索數據並加載到 Pandas dataframe 后,關於存儲十六進制 ObjectID 的推薦做法是什么?

我認為,存儲為字符串時,它們占用了大量的 memory,這在非常大的數據集中可能會受到限制。 將它們轉換為整數(從十六進制到十進制)是個好主意嗎? 這不會減少 memory 的使用並加快處理速度(合並、查找...)嗎?

順便說一句,這就是我的做法。 這是最好的方法嗎? 不幸的是,NaN 失敗了。

tank_hist['id'] = pd.to_numeric(tank_hist['id'].apply(lambda x: int(str(x), base=16)))

首先,我認為它是 NaN,因為 object ID 大於 64 位 integer。 Python 可以處理,但底層的 pandas/numpy 可能不能。

我認為您想使用 map 來提取一些有用的字段,以后可以對其進行多級排序。 不過,我不確定您是否會看到預期的性能改進。

我將首先在您的框架中創建一個新系列“oid_*”並檢查您的結果

https://docs.mongodb.com/manual/reference/method/ObjectId/

將 object id 分解為以下組件:

  • 時間戳(4 字節),
  • 隨機(5 個字節 - 曾經是主機標識符),以及
  • 計數器(3 個字節)

這些 integer 尺寸很好,適合 numpy 處理的 integer 尺寸。

tank_hist['oid_timestamp'] = tank_hist['id'].map(lambda x: int(str(x)[:8], 16))
tank_hist['oid_random'] = tank_hist['id'].map(lambda x: int(str(x[:4])[8:18], 16))
tank_hist['oid_counter'] = tank_hist['id'].map(lambda x: int(str(x[:4])[18:], 16))

這將允許您對時間戳系列進行主要排序,對框架中的其他系列進行次要排序? 然后在櫃台上進行第三次排序。

地圖是戳系列中每條記錄的超級有用(盡管速度很慢)的方法。 請意識到,如果您在此處添加計算時間以換取稍后節省此計算時間。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.map.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM