不重復大數據量的批量生成


在工作中,同事遇到一個需要批量生成不重復碼的功能,之前我處理的都是用php 直接用數組 in_array解決的,那時候生成的數量倒還不多,大概也就幾萬個,所以直接將php的運行內存提高一點,然后就解決問題了。但是這次要處理的數據量比較大,是五千萬個,就容易出現問題。

首先,運行內存是肯定不夠的,然后存儲空間也會受到限制,代碼的效率在php超時的情況下會出現問題。30秒對於這樣的數據處理而言還是太短了,從生成情況來看,前面的生成比較快,后面的生成就逐漸的慢下來了,因為要保證和前面的不重復,如果不判斷是否重復,也是很快的。

我們的第一種方案是,先以100萬為批次的生成,然后導入數據庫,在數據庫的表中以該字段做主鍵,后來發現這樣的方式導入比較慢,改為主鍵自增導入,然后加快了速度,全部導入后,采用group by 分組 查詢那些出現重復的,刪除掉,再補充相應數量的碼即可。

經前同事提醒,給我提供了第二種思路,采用redis的存儲比對來完成數據不重復的功能,在redis中有一個哈希的類型,不斷的將生成的碼放入該鍵中,使用 hset方法,這個方法會覆蓋或者新增某個鍵對應的值 我用的核心代碼如下

$result=$redis->hset("code_list",$code,$code);

這樣能根據生成的碼 本身做鍵,來存儲和替換,如果生成了重復了 就把之前的覆蓋掉了,這樣能正確的計算數量。然而在實際的redis操作過程發現,自己電腦內存不夠用,當生成三千三百萬數據的時候,輸入info查看到memory的情況如下

很明顯已經達到了5.04G,我的電腦已經卡頓,打字和移動鼠標逐漸變得困難,就沒有繼續實驗了。這個增長速度也是剛開始很快,后來逐漸的變慢了。然后增長的也越來越慢,而電腦也越來越卡,實驗終止了,我想如果以后有機會我還是會嘗試的,畢竟這個思路是很獨特,可以借鑒一下,但是這個本身是在NOSQL上面實驗,內存的耗費上容易出現問題。為什么mysql沒有出現這樣的問題呢?因為mysql本身把數據存儲在物理磁盤上了,redis的數據還在內存中,這是不能比的。在本次試驗中,發現2千萬以前的數據還是比較好生成的,超過3千萬,就容易出問題,我電腦配置是

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM