RangeBitmap提升Java流資料過濾效能
假設您正在使用 Java 進行某種資料分析,也許您正在分析交易(如銷售)。Transaction在對物件執行計算之前,您需要評估複雜的過濾器。
public static final class Transaction { private final int quantity; private final long price; private final long timestamp; public Transaction(int quantity, long price, long timestamp) { this.quantity = quantity; this.price = price; this.timestamp = timestamp; } public int getQuantity() { return quantity; } public long getPrice() { return price; } public long getTimestamp() { return timestamp; } } |
在 Java 程式中進行過濾使用流 API:
transactions.stream() .filter(transaction -> transaction.quantity >= qty && transaction.price <= price && transaction.timestamp >= begin && transaction.timestamp <= end) .forEach(this::processTransaction); |
假設交易實際上是按時間排序的,那麼時間戳條件應該是可預測的,但並沒有首先評估。
這意味著不可預測的價格price 和數量quantity 條件要對每個交易進行評估。
如果重新安排條件的順序可以使執行時間縮短一半。
RangeBitmap
將範圍謂詞應用於未排序的資料,由RoaringBitmap庫RangeBitmap中的資料結構解決。
資料結構是不可變的,並且受益於對資料集中值範圍的瞭解,但是如果需要評估多個過濾器,則為每個屬性建立索引可能是值得的。
long minTimestamp = Long.MAX_VALUE; long maxTimestamp = Long.MIN_VALUE; long minPrice = Long.MAX_VALUE; long maxPrice = Long.MIN_VALUE; int minQty = Long.MAX_VALUE; int maxQty = Long.MIN_VALUE; for (Transaction transaction : transactions) { minTimestamp = Math.min(minTimestamp, transaction.getTimestamp()); maxTimestamp = Math.max(maxTimestamp, transaction.getTimestamp()); minPrice = Math.min(minPrice, transaction.getPrice()); maxPrice = Math.max(maxPrice, transaction.getPrice()); minQty = Math.min(minQty, transaction.getQuantity()); maxQty = Math.max(maxQty, transaction.getQuantity()); } var timestampAppender = RangeBitmap.appender(maxTimestamp - minTimestamp); var priceAppender = RangeBitmap.appender(maxPrice - minPrice); var qtyAppender = RangeBitmap.appender(maxQty - minQty); for (Transaction transaction : transactions) { timestampAppender.add(transaction.getTimestamp() - minTimestamp); priceAppender.add(transaction.getPrice() - minPrice); qtyAppender.add(transaction.getQuantity() - minQty); } var timestampIndex = timestampAppender.build(); var priceIndex = priceAppender.build(); var qtyIndex = qtyAppender.build(); |
兩者是否傳遞資料或半頁程式碼是否值得取決於您需要執行多少過濾器以及它們需要多快。
RangeBitmap產生一個RoaringBitmap滿足謂詞的索引,並且可以將RoaringBitmap引數作為輸入來跳過已經過濾掉的行。之前使用的 Streams API 程式碼被翻譯成RangeBitmapAPI 呼叫:
RoaringBitmap inTimeRange = timestampIndex.between(minTimeThreshold - minTime, maxTimeThreshold - minTime); RoaringBitmap matchesQuantity = qtyIndex.gte(minQtyThreshold - minQty, inTimeRange); RoaringBitmap matchesPrice = priceIndex.lte(maxPriceThreshold - minPrice, matchesQuantity); matchesPrice.forEach((IntConsumer) i -> processTransaction(transactions.get(i))); |
每個屬性的最小值錨定有點複雜,但提高了效率(除非最小值無論如何都是零),這將在實際應用程式中透過便利類更好地抽象。對於相同的資料,這比二分搜尋方法快約 2 倍.
RangeBitmap旨在為Apache Pinot中的範圍索引提供支援,因此被壓縮並支援與磁碟的零複製對映。RangeBitmap - How range index work in Apache Pinot 中有更多關於它如何深入工作的詳細資訊。
相關文章
- Java中的並行流處理與效能提升Java並行
- ELK<logstash>過濾json資料JSON
- 使用MySQL之過濾資料MySql
- Java™ 教程(資料流)Java
- 資料庫效能提升終極指南資料庫
- 一種透過延遲事務提升資料庫效能的方法資料庫
- 菜鳥學習筆記:Java提升篇6(IO流2——資料型別處理流、列印流、隨機流)筆記Java資料型別隨機
- 【Python】透過Cython提升效能Python
- 效能提升 48 倍! python redis 批量寫入大量資料優化過程PythonRedis優化
- Wireshark-過濾器-資料包解析過濾器
- OpenYurt 之 Yurthub 資料過濾框架解析框架
- 過濾搜尋引擎的抓取資料
- 通過Vue的過濾器實現資料的資料脫敏Vue過濾器
- Java遞迴遍歷資料夾及檔案過濾器使用(FileFilter)Java遞迴過濾器Filter
- 鯤雲科技CAISA資料流技術實現新突破,AI晶片實測效能提升3.91倍AI晶片
- 資料庫知識點(5)——多列過濾資料庫
- PHP 對資料進行驗證和過濾PHP
- Vue專案資料動態過濾實踐Vue
- 資料採集之:巧用布隆過濾器提取資料摘要過濾器
- Java實現過濾中文亂碼Java
- Java設計模式-過濾器模式Java設計模式過濾器
- 乾貨|九九互動的資料效能提升之路
- 高效能資料匯入方案&表過濾器&一對多支援篩選- .NET SqlSugar ORM過濾器SqlSugarORM
- Yii2 search 搜尋[資料小部件--GridView--資料過濾]View
- Elasticsearch 根據陣列長度過濾資料(qbit)Elasticsearch陣列
- Milvus 向量資料庫如何實現屬性過濾資料庫
- 關於dcat-admin 資料庫過濾查詢資料庫
- python過濾nginx access日誌存入資料庫中PythonNginx資料庫
- Java 8並行流的效能陷阱Java並行
- Java Stream過濾器案例解說 - FoojayJava過濾器
- Java List集合去重、過濾、分組、獲取資料、求最值、合併、排序、跳資料和遍歷Java排序
- Java開發規範(效能提升)更新中Java
- 過濾
- 遊戲流暢度再次提升 RTX 2060 Super效能暴漲遊戲
- RoaringBitmap外掛能將ElasticSearch過濾效能提高 10 倍Elasticsearch
- SpringBoot 過濾器更改 Request body ,並實現資料解密Spring Boot過濾器解密
- Python - pandas 利用 某一列的值過濾資料Python
- [java IO流]之 基本資料型別輸入輸出流Java資料型別