當前位置:
首頁 > 知識 > PHP實現文本快速查找-二分查找法

PHP實現文本快速查找-二分查找法

起因

先說說事情的起因,最近在分析數據時經常遇到一種場景,代碼需要頻繁的讀某一張資料庫的表,比如根據地區ID獲取地區名稱、根據網站分類ID獲取分類名稱、根據關鍵詞ID獲取關鍵詞等。雖然以上需求都可以在原始建表時,通過冗餘數據來解決。但仍有部分業務存的只是關聯表的ID,數據分析時需要頻繁的查表。

所讀的表存在共同的特點

數據幾乎不會變更

數據量適中,從一萬到100多萬,如果全載入到內存也不太合適。

糾結的地方

在做數據分析時,需要十分頻繁的讀這些表,每秒有可能需要讀上萬次。其實內部的資料庫集群完全可以勝任,但會對線上業務稍有影響。(你懂得,小公司不可能為離線分析做一套完整的數據存儲服務。大部分數據分析還要藉助線上的數據集群)

優化方案的思考

有沒有一種方式可以不增加線上的壓力,同時提供更高效的查詢方式?想過redis,但最終選擇用文本存儲。因為數據分析是一個獨立的需求,不希望與現有的redis集群或者其它存儲服務有交集。還有一個原因是每次分析的中間結果,對下一次分析並沒有很大的實質作用,並不需要把結果持久存儲,而且占的內存也會較多。最終使用文本存儲,然後用二分來查找。特點,1,存儲非常快,雖然redis等nosql服務雖然已經非常快,但仍無法與文本存儲相提並論;2,查找的時候使用二分查找,百萬條記錄查詢也可在0.1ms內完成(使用線上的普通硬碟,如果是ssd盤會更快)。

實現步驟

將資料庫中需要的欄位導出到文本

將導出的文本(已經按id進行過排序)轉換格式重新存儲

程序讀取轉換後的格式

文本存儲格式

說明 :需求中,文本每行有兩列,第一列是主建ID(數字),第二列為文本。整個文本已經按第一列有序排列,兩列之間用tab鍵分隔。 之前有看過ip.dat的存儲,本次仿照其存儲格式:將文本中的內容每行轉換為固定長度後,存儲到新的文件。搜索時,使用文件操作函數fopen,fseek,fgets等函數按位元組讀取內容,並以二分查找法快速定位需要的內容。

代碼實現部分

通用類,類似需求只需要提供符合標準的文本(每行兩列,第一列為查找的ID,第二列為文本。同時文本已經按第一列有序排序)

生成以上所提到的存儲格式

提供根據id查詢介面

代碼片斷

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 PHP技術大全 的精彩文章:

swoole2-mysqlpool:基於 Swoole 2 協程特性實現的 MySQL 連接池
Deployer 5.0.0 發布,PHP 編寫應用部署工具
symfony中使用NelmioApiDocBundle進行API管理
為什麼Swoole可以加速php
浮躁的中國企業奴隸化中國年輕人

TAG:PHP技術大全 |

您可能感興趣

PHP UDP攻擊查找源頭
python實現二分查找演算法/二分排序演算法
ORACLE 如何檢查找出損壞索引
10秒內快速查找實驗指南
Linux下的文件查找
使用Python查找目錄中的重複文件
如何在 Linux 上查找硬體規格
Linux中的文件查找技巧
Android Q 迎來可快速配對設備的全新「查找我的配件」功能
Firefox 62將使用DNS over HTTPS技術終結DNS查找明碼風險
蘋果將用新App取代「查找我的iPhone」功能
Linux裡面的搜索查找類指令
C++常用查找演算法總結
快速查找科普內容!
DTminer:快速查找基因與疾病的關係的工具
YouTube全球範圍內出現宕機,官方正在查找原因
快速查找3D asset,Unity推出3D內容搜索引擎Visual Search
一圖看懂:AI路徑查找器
SQL Servere 通過LIKE在另一個字元串中查找字元串
三星官微回應華為P20 Pro吊打S9+:對不起 無法查找到F1.8光圈